2011-09-06 3 views
16

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

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) 

Любые предложения о том, как решить эту проблему?

+0

У вас есть файл '' /data/data/com.dhani.Lazy/databases/LazyDB.sqlite ''? – Caner

+0

@LAS_VEGAS да, у вас есть файл «/data/data/com.dhani.Lazy/databases/LazyDB.sqlite», и я также могу выполнить SQLite-запросы на нем. все работает, но в журнале появляется ошибка выше. – Kishore

ответ

6

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

+0

это мой манифест Kishore

+4

Hi Kishore какое изменение у вас есть сделал? Я также получаю ту же проблему .... –

3

У меня был один и тот же код ошибки на LogCat: (! Я на самом деле не заметил никаких проблем, пока я не смотрел на LogCat)

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

приложение будет работать нормально. Logcat сообщил мне об этой ошибке, поэтому я подумал, что лучше всего решить эту проблему сейчас.

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

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

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

3

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

  1. В опции настройки эмулятора выберите Приложение
  2. Go Управление приложениями
  3. Найдите приложение и нажмите Удалить
  4. Затем запустите приложение снова из Eclipse.
+0

ok ... какой способ для деинсталляции и установки каждого режима отладки выполнения? –

6

Сегодня этот вопрос стоил мне 3 часа. То, что я пробовал:

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

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

Приложение работает красиво сейчас.

+5

Похоже, вы могли бы сэкономить время, просто сделав чистую. – PearsonArtPhoto

2

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

2

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

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(); 
} 

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

8

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

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

Потому что я ленивый, я просто использовал /данные/данные // файлы/папки, когда я нахожусь в режиме эмулятора. Вы можете получить файлы 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); 
} 

EDIT: Я пытался войти в Facebook (мое приложение имеет интеграцию FB) на эмуляторе и папки/базы данных появились после этого (и сохраняется). Не уверен, что произошло, но можно как-то создать эту папку. Что-то для другого эксперта здесь, чтобы пролить свет.

+0

У меня есть тот же logcat ... проверьте, что у вашего имени db нет буквенных символов в его строке –

2

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

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

SQLiteDatabase db=getWritableDatabase(); 
db.close(); 
+0

i переименовать мой db, у которого есть символ CAPS в первой букве? и разрешено .. это правда? –

6

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

Что решить ее, заменял

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

с

String myPath = myContext.getFilesDir().getAbsolutePath().replace("files", 
"databases")+File.separator + DB_NAME; 
+1

My db находится в разделе «/ data/data/YOUR_PACKAGE/files /». Должен ли он находиться в подпапке «базы данных»? – gdbj

+0

Да, поместите его в папку «базы данных» – SteBra

+0

Наконец-то я получил работу. хотел повернуть назад, что он отлично работает в подпапке «файлы». – gdbj

2

Убедитесь, что вы закрываете все курсор и DB экземпляров. У меня была эта ошибка из-за создания нескольких вложений и обновлений, а не закрытия курсоров, вызывающих утечки курсора и невозможности открыть db.

+0

спасибо! добавление cursor.close() помогло мне. –

Смежные вопросы