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

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

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

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

Итак, кто-нибудь может научить меня использовать мои собственные данные? Не могли бы вы рассказать мне настройки?

Solutions Collecting From Web of "Как использовать мою собственную базу данных sqlite?"

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

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

  2. Используя тот же класс утилиты, чтобы открыть db с помощью 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); } } 

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

Вот моя версия из кода «Сильвио Доннини» :), теперь вы можете легко обновить базу данных.

 private static final String DB_PATH = "/data/data/pakagename/databases/"; private static final String DB_NAME = "databaseName"; private static SQLiteDatabase db; public static void createDatabaseIfNotExists(Context context,int version) 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 db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.OPEN_READONLY); if (db.getVersion() != version) { dbFile.delete(); createDb = true; } } if (createDb) { // Open your local db as the input stream InputStream myInput = context.getResources().openRawResource(R.raw.database); // 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(); SQLiteDatabase dbwrite = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.OPEN_READWRITE); dbwrite.setVersion(version); dbwrite.close(); if (db != null) db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.OPEN_READONLY); } } public static SQLiteDatabase getStaticDb() { if (db != null) return db; return SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.OPEN_READONLY); } 

Я знаю, что это старый вопрос, но я потерял много времени, выясняя это, с помощью всех ответов.


Проблема заключается в том, что устройство хранит базу данных в своей базе данных data / data /…/. Итак, когда вы меняете sth о базе данных (имя, добавьте таблицу метаданных android, размер ..), это не будет иметь никакого значения из-за сохраненной базы данных и метода, который проверял существующую базу данных.


Чтобы получить новейшую базу данных, после ее изменения вы должны запустить программу, не проверяя существующие базы данных (например, вместо dbExist = checkDataBase(); сделайте ее просто ложной).

 dbExist = checkDataBase(); 

Изменить на:

 dbExists = false; 

После того, как вы подняли «новый» файл данных, вы можете вернуться к проверке существующих.

Надеюсь, это поможет кому-то, дина

Я знаю, что это старый пост, но для тех, кто все еще здесь, после поиска Google или Bing, это решение указанной проблемы:

В createDataBase () выполняется следующая проверка;

 this.getReadableDatabase(); 

Это проверяет, существует ли уже база данных с указанным именем, а если нет, создается пустая база данных, которая может быть перезаписана той, что находится в папке с ресурсами. На новых устройствах это работает безупречно, но есть некоторые устройства, на которых это не работает. Главным образом старые устройства. Я не знаю точно, почему, но похоже, что функция getReadableDatabase () не только получает базу данных, но и открывает ее. Если вы затем скопируете базу данных из папки активов поверх нее, у нее все еще есть указатель на пустую базу данных, и вы получите таблицу, в которой отсутствуют ошибки.

Поэтому, чтобы заставить его работать на всех устройствах, вы должны изменить его на следующие строки:

 SQLiteDatabase db = this.getReadableDatabase(); if (db.isOpen()){ db.close(); } 

Даже если база данных открыта в чеке, она закрывается после этого, и это не даст вам больше проблем.

Успокойтесь, ребята, После долгих исследований наконец нашли глупую ошибку для ошибки «нет такой таблицы»

Проверьте имя базы данных в папке «Активы», если она похожа на «DATABASE_NAME.EXTENSION», а затем поместила полное имя в класс Helper с расширением, и решила мою проблему.

Например, в Assets имя базы данных login.sqlite или login.db ничего. Поместите DB_NAME = login.sqlite полностью с расширением. Этот учебник теперь работает отлично.

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

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

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

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