SQLite вернул код ошибки 14 - PullRequest
       2

SQLite вернул код ошибки 14

16 голосов
/ 06 сентября 2011

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

sqlite returned: error code = 14, msg = cannot open file at source line 25467

09-06 11:23:41.844: INFO/Database(22560): sqlite returned: error code = 14, msg = cannot open file at source line 25467
09-06 11:23:41.885: ERROR/Database(22560): sqlite3_open_v2("/data/data/com.dhani.Lazy/databases/LazyDB.sqlite", &handle, 1, NULL) failed
09-06 11:23:41.885: WARN/System.err(22560): android.database.sqlite.SQLiteException: unable to open database file
09-06 11:23:41.894: WARN/System.err(22560):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
09-06 11:23:41.904: WARN/System.err(22560):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1849)
09-06 11:23:41.914: WARN/System.err(22560):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Database.DataBaseHelper.checkDataBase(DataBaseHelper.java:72)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Database.DataBaseHelper.createDataBase(DataBaseHelper.java:47)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Database.DataBaseHelper.Login(DataBaseHelper.java:166)
09-06 11:23:41.914: WARN/System.err(22560):     at com.dharani.LazyApple.Views.LoginView$1.onClick(LoginView.java:63)
09-06 11:23:41.934: WARN/System.err(22560):     at android.view.View.performClick(View.java:2485)
09-06 11:23:41.934: WARN/System.err(22560):     at android.view.View$PerformClick.run(View.java:9080)
09-06 11:23:41.944: WARN/System.err(22560):     at android.os.Handler.handleCallback(Handler.java:587)
09-06 11:23:41.944: WARN/System.err(22560):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-06 11:23:41.944: WARN/System.err(22560):     at android.os.Looper.loop(Looper.java:123)
09-06 11:23:41.944: WARN/System.err(22560):     at android.app.ActivityThread.main(ActivityThread.java:3683)
09-06 11:23:41.964: WARN/System.err(22560):     at java.lang.reflect.Method.invokeNative(Native Method)
09-06 11:23:41.964: WARN/System.err(22560):     at java.lang.reflect.Method.invoke(Method.java:507)
09-06 11:23:41.964: WARN/System.err(22560):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
09-06 11:23:41.964: WARN/System.err(22560):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
09-06 11:23:41.964: WARN/System.err(22560):     at dalvik.system.NativeStart.main(Native Method)

Есть предложения по решению этой проблемы?

Ответы [ 10 ]

8 голосов
/ 29 августа 2013

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

Я думаю, что знаю причину этой причины (по крайней мере,для моего случая).Посмотрев в DDMS -> File Explorer , вы поймете, что папка базы данных (/ data / data // database /) не существует,именно поэтому приложение не может создать файл базы данных в этой несуществующей папке.Если вы можете каким-либо образом создать папку базы данных, вы можете избежать этой проблемы.

Поскольку я ленив, я просто использовал / data / data // files / folder когда я в режиме эмулятора.Вы можете получить файлы dir, используя это:

context.getFilesDir().getPath()

Это прекрасно работает для меня в эмуляторе.

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

В случае, если вы хотите увидетьнекоторый код:

String dbFilename = "example.db";
try
{       
    File databaseFile = getDatabasePath(dbFilename);        
        SQLiteDatabase _db = SQLiteDatabase.openOrCreateDatabase(databaseFile);
} catch (Exception e)
{
    String databasePath =  getFilesDir().getPath() +  "/" + dbFilename;
    File databaseFile = new File(databasePath); 
    _db = SQLiteDatabase.openOrCreateDatabase(databaseFile);
}

РЕДАКТИРОВАТЬ: я попытался войти в Facebook (мое приложение имеет интеграцию с FB) в папке эмулятора и / базы данных появился после этого (и сохранился).Не уверен, что случилось, но можно как-то создать эту папку.Кое-что для другого эксперта здесь, чтобы пролить свет.

6 голосов
/ 28 ноября 2013

У меня была такая же проблема.

Что решило это, было замена

private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";

с

String myPath = myContext.getFilesDir().getAbsolutePath().replace("files",
"databases")+File.separator + DB_NAME;
6 голосов
/ 27 декабря 2012

Сегодня этот выпуск обошелся мне в 3 часа. Что я пробовал:

  • Переписать копию базы данных кода.
  • Удаление приложения из эмулятора / устройства
  • Эмулятор (ы) очистки
  • Очистительное затмение
  • Изменение прав доступа к файлу

Я решил проблему, скопировав код из общей учетной записи Dropbox в другое место и реорганизовав код в манифесте Android и файлах Java с другим именем пакета.

Приложение теперь прекрасно работает.

6 голосов
/ 06 сентября 2011

Я видел эту ошибку, если вы используете sharedUserId в манифесте.Если вы измените sharedUserId приложения и переустановите приложение, у него не будет требуемого владельца для записи в базу данных SQLite.

3 голосов
/ 14 февраля 2012

Или другое простое решение, которое сработало для меня, выглядит следующим образом:

  1. В настройках эмулятора выберите Приложение
  2. Перейти к управлению приложениями
  3. Найдите ваше приложение и нажмите Удалить
  4. Затем снова запустите приложение из Eclipse.
3 голосов
/ 28 января 2012

У меня был тот же код ошибки на logcat:

sqlite returned: error code = 14, msg = cannot open file at source line

Приложение работало бы нормально (я фактически не заметил никаких проблем, пока не посмотрел на logcat!).Logcat проинформировал меня об этой ошибке, поэтому я подумал, что было бы лучше решить эту проблему сейчас.

Оказывается, что если я отредактировал файл манифеста, он избавился от ошибки!В моем манифесте я набрал неправильную версию min sdk.Я обнаружил это, потому что в файле манифеста в левой колонке кода был восклицательный знак, информирующий меня о моей ошибке.

Чтобы быть точным, я бы порекомендовал вам убедиться, что все ошибки / восклицания былиисправлено, так что вы можете, по крайней мере, исключить их.

Кажется, эта ошибка (и многие другие в затмении) может произойти в зависимости от огромного количества факторов!О, радости!

2 голосов
/ 05 июля 2016

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

2 голосов
/ 16 ноября 2013

Мне удалось решить эту проблему, поняв, что документация немного вводит в заблуждение.Вам нужно иметь имя файла для вашего архива, связанного с именем вашей базы данных.Например, если ваша база данных называется someData.db, ваш zip-файл должен быть someData.zip.

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

SQLiteDatabase db=getWritableDatabase();
db.close();
2 голосов
/ 10 июля 2013

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

    InputStream myInput = myContext.getAssets().open(DB_NAME);

    //Destination folder (where we created the DB empty)
    String outFileName = DB_PATH + DB_NAME;

    //We opened it BBDD Vacia as OutputStream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //Transfers Bytes between input and output Stream
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

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

После этого выполните свои операции.Удачи!

2 голосов
/ 02 февраля 2013

У меня была другая причина: я получил доступ к онлайн-версии приложения, которое создало базу данных.Приложение PhoneGap не может получить доступ к файлу, созданному другим приложением.Очистка кеша браузера решила мою проблему.

...