Как использовать мою собственную sqlite базу данных?

Я поместил свое поле базы данных в папку "активов". И используйте код из этого блога для копирования базы данных в "/data/data/my_packname/databases /", (Этот код копии, я выполняю его в onCreate () метод, когда я запускаю это приложение), затем используют выбор * от... для получения данных. Но это дает мне исключение: никакая такая таблица.

Кто-то сказал мне, что, если я пытаюсь скопировать файл в onCreate SQLiteOpenHelper (), слишком поздно. Таким образом, код файла копии не может скопировать полный файл.

Таким образом, я должен использовать adb или ddms для получения по запросу базы данных сначала?

Так, Кто-либо может учить меня, как использовать мой собственный databse? Можно ли сказать мне установку?

7
задан Janusz 5 March 2010 в 15:02
поделиться

3 ответа

После копирования базы данных попробуйте закрыть и снова открыть объект SQLiteDatabase перед выполнением к нему любого запроса. У меня была аналогичная проблема с копированием db из входного потока, и это решило ее для меня.

1
ответ дан 6 December 2019 в 21:12
поделиться

Способ создания базы данных из опубликованной вами статьи немного отличается от того, как это делается в примерах для Android (я не хочу говорить, хорошо это или плохо).

Я научился использовать базы данных из образца NotePad SDK

Это хороший пример для начала, поскольку он охватывает как тему создания базы данных, так и доступ к базе данных через ContentProvider (это действительно единственный хороший способ получить данные from db, иначе у вас возникнут проблемы при попытке получить данные одновременно из многих мест вашего кода).

Вы должны отметить, что SQLiteOpenHelper действительно мощный и «поможет вам», если вы будете использовать его правильно. Например, он хранит текущую версию базы данных (не версию sqlite, а номер, который вы присваиваете с версией схемы базы данных), и когда вы создаете новую версию приложения с новой структурой базы данных, вы можете обновить текущую схему до новой версии в onUpdate.

-1
ответ дан 6 December 2019 в 21:12
поделиться

Я использовал инструкции в этом сообщении в блоге и нашел их, хотя и на правильном пути, чтобы серьезно усложнить проблему за счет излишнего расширения SQLiteOpenHelper . Мне гораздо больше повезло, если я сделал следующее:

  1. Создайте служебный класс, который создает статическую базу данных, копируя ее в правильный каталог из ресурсов, но не слишком зацикливаясь на следовании формату SQLiteOpenHelper.

  2. Использование того же служебного класса для открытия базы данных с помощью SQLiteDatabase.openDatabase ()

Изменить: вот версия этого служебного класса, который я создал; это не совсем полно, но вы уловите суть.

public class DbUtils {
    private static final String DB_PATH = "/data/data/com.mypackage.myapp/databases/";
    private static final String DB_NAME = "my.db";

    public static void createDatabaseIfNotExists(Context context) throws IOException {
        boolean createDb = false;

        File dbDir = new File(DB_PATH);
        File dbFile = new File(DB_PATH + DB_NAME);
        if (!dbDir.exists()) {
            dbDir.mkdir();
            createDb = true;
        }
        else if (!dbFile.exists()) {
            createDb = true;
        }
        else {
            // Check that we have the latest version of the db
            boolean doUpgrade = false;

            // Insert your own logic here on whether to upgrade the db; I personally
            // just store the db version # in a text file, but you can do whatever
            // you want.  I've tried MD5 hashing the db before, but that takes a while.

            // If we are doing an upgrade, basically we just delete the db then
            // flip the switch to create a new one
            if (doUpgrade) {
                dbFile.delete();
                createDb = true;
            }
        }

        if (createDb) {
            // Open your local db as the input stream
            InputStream myInput = context.getAssets().open(DB_NAME);

            // Open the empty db as the output stream
            OutputStream myOutput = new FileOutputStream(dbFile);

            // transfer bytes from the inputfile to the outputfile
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, length);
            }

            // Close the streams
            myOutput.flush();
            myOutput.close();
            myInput.close();
        }
    }

    public static SQLiteDatabase getStaticDb() {
        return SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.OPEN_READONLY);
    }
}
12
ответ дан 6 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: