Intereting Posts
Упорядоченные списки внутри Android TextView Android Studio / Intellij, Gradle Error: Причина: peer не аутентифицирован Android: Как добавить HTML-ссылки внутри ListView? Завершение курсора, который не был деактивирован или закрыт нефатальной ошибкой Следуйте за местоположением пользователя на MapView React Native AirBnb. Можно ли программным образом удалить запоминаемые группы Wifi Direct из Android? Получение размера окна БЕЗ заголовков / предупреждений Получение координат и ширины / высоты из матрицы Выбранный плагин, похоже, не работает на мобильных браузерах Получено исключение: фрагмент уже активен Как избежать повторной компоновки общей иерархии представлений при использовании EditText? Слово @drawable неправильно написано Тест эспрессо завершился неудачно после успешного нажатия и блокировки в течение 60 секунд Как установить ListView не clickable Ошибка подключения к Интернету

Как использовать мою собственную базу данных 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.