Внешне сгенерированная база данных SQLite считается доступной только для чтения в SQLiteOpenHelper для Android - PullRequest
1 голос
/ 21 января 2011

У меня есть база данных SQLite, которую я сгенерировал с помощью найденного соединителя SQLite JDBC здесь .

Затем я скопировал эту базу данных на SD-карту моего телефона Android и попытался открыть, используя SQLiteOpenHelper.Я получаю следующие исключения:

ERROR/SQLiteOpenHelper(7373): android.database.sqlite.SQLiteException: attempt to write a readonly database: BEGIN EXCLUSIVE;

ERROR/AndroidRuntime(7373): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 1: /mnt/sdcard/4Trak/4Trak.db

Это не имеет никакого смысла для меня.Почему это база данных только для чтения?Я смог написать его, чтобы сгенерировать в первую очередь, и снова, когда понял, что мне понадобится таблица android_metadata, и добавил ее с помощью браузера SQLite.

Ответы [ 2 ]

4 голосов
/ 21 января 2011

Sqlite будет открывать базы данных только из каталога базы данных ваших приложений.

DB_PATH = "/data/data/"+ context.getPackageName() + "/databases/"; 

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

InputStream myInput = myContext.getAssets().open(DB_NAME);      
String outFileName = DB_PATH + DB_NAME;     
OutputStream myOutput = new FileOutputStream(outFileName);

byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
    myOutput.write(buffer, 0, length);
}

myOutput.flush();
myOutput.close();
myInput.close();

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

checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

Сообщите мне, если у вас есть какие-либо вопросы

1 голос
/ 18 августа 2011

Это только что произошло со мной.Я написал программу, которая находится в «производстве» и на устройстве и содержит данные в БД SQLite.

Я сделал резервную копию этих данных в виде операторов SQL (через aSQLiteManager).На эмуляторе я воссоздал эту базу данных.

Затем я запустил свою программу, которая ожидала БД версии 5. Мой первый доступ к программе был через getReadableDatabase в подклассе SQLiteOpenHelper.

И вот, я получил это исключение: не могу обновить базу данных только для чтения с версии 0 до 5.

Я исправил ее, заменив вызов open на getWritableDatabase.

Теперь этостановится странным, потому что помощник SQLite вызвал onCreate, который содержал операторы CREATE TABLE, в то время как таблицы уже были там, поэтому это привело к другой ошибке.Я должен был закомментировать весь текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...