2011-09-06 3 views
16

Sto tentando di copiare un database esistente dalla mia cartella delle risorse ed eseguire alcune operazioni su di esso. Tutto sta funzionando benissimo, ma ho ottenuto il seguente errore nel file di registro del mio emulatore:SQLite ha restituito un codice di errore di 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) 

Tutti i suggerimenti su come risolvere questo problema?

+0

Sei sicuro di avere il file '" /data/data/com.dhani.Lazy/databases/LazyDB.sqlite "'? – Caner

+0

@LAS_VEGAS si, avere il file in "/data/data/com.dhani.Lazy/databases/LazyDB.sqlite" e posso anche eseguire query SQLite su di esso. tutto è funzionante ma nel log compare l'errore sopra. – Kishore

risposta

6

Ho riscontrato questo errore se si sta utilizzando sharedUserId nel file manifest. Se si modifica sharedUserId di un'applicazione e si reinstalla l'applicazione, non ha la proprietà necessaria per scrivere nel database SQLite.

+0

questo è il mio manifest Kishore

+4

Ciao Kishore cosa cambi hai ha fatto? anche io sto ottenendo lo stesso problema .... –

3

Ho avuto lo stesso codice di errore sul logcat: (! Io in realtà non ho notato problemi fino a quando ho guardato logcat)

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

L'applicazione sarebbe funzionare bene. Logcat mi ha informato di questo errore, quindi ho pensato che sarebbe stato meglio risolverlo ora.

Si scopre che se ho modificato il file manifest si è liberato dell'errore! All'interno del mio manifest ho digitato la versione min sdk errata. L'ho scoperto perché all'interno del file manifest c'era un indicatore di esclamazione lungo la colonna sinistra del codice che mi informava del mio errore.

Per essere precisi, ti consiglio di assicurarti che tutti gli errori/esclamazioni siano stati corretti in modo da poterli escludere.

Sembra che questo errore (e molti altri in eclissi) possa verificarsi a seconda di un vasto numero di fattori! Oh le gioie!

3

Oppure, un'altra soluzione semplice che ha lavorato per me è la seguente:

  1. In opzione delle impostazioni dell'emulatore, fare clic su Applicazione
  2. Go per gestire le applicazioni
  3. Trova la tua App, e fare clic su Disinstalla
  4. Quindi esegui nuovamente l'app da Eclipse.
+0

ok ... quale modo per disinstallare e installare ogni modalità di debug di esecuzione? –

6

Oggi questo problema mi è costato 3 ore. Cosa ho provato:

  • Riscrivere il codice del database di copia.
  • eliminazione dell'app dall'emulatore/dispositivo
  • Pulendo emulatore (s)
  • pulizia eclissi
  • Cambiare i permessi dei file

ho risolto il problema copiando il codice da un account Dropbox condiviso per un'altra posizione e refactoring del codice nel file Manifest Android e java con un altro nome di pacchetto.

L'applicazione funziona perfettamente ora.

+5

Sembra che tu possa aver risparmiato un po 'di tempo semplicemente facendo una pulizia. – PearsonArtPhoto

2

La mia ragione era diversa: ho accesso alla versione online dell'app, che ha creato il database. L'applicazione PhoneGap non è quindi in grado di accedere al file creato da un'app diversa. Cancellare la cache del browser ha risolto il mio problema.

2

L'enigma è risolto, testata nell'emulatore senza il DB e contrassegnarli sbagliato, quindi è necessario creare il 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(); 
} 

Dopo di che, fare le vostre operazioni. In bocca al lupo!

8

Questo potrebbe essere un po 'in ritardo, ma spero che questo aiuti per chi ottiene questo problema (dal momento che non riesco a trovare una soluzione definitiva in giro).

Penso di conoscere il motivo di questa causa (almeno per il mio caso). Guardando negli DDMS -> File Explorer, ci si rende conto che la cartella database (/// DATA // database) non esiste, che è il motivo per cui l'applicazione non è in grado di creare il file di database in quel cartella inesistente. Se è possibile creare una cartella di database in qualche modo, è possibile evitare questo problema.

Siccome sono pigro, ho solo usato le /dati/dati // file/cartella quando sono in modalità emulatore. È possibile ottenere il file utilizzando dir questo:

context.getFilesDir().getPath() 

questo ha funzionato benissimo per me nell'emulatore.

Spero che questo aiuti qualcuno.

Nel caso in cui si vuole vedere qualche codice:

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: Ho provato accedendo al Facebook (la mia applicazione ha integrazione FB) sull'emulatore e la cartella/database è apparso dopo che (e insistetti). Non sono sicuro di cosa sia successo, ma è possibile creare quella cartella in qualche modo. Qualcosa per un altro esperto qui intorno per far luce.

+0

ho lo stesso logcat ... controlla il tuo nome db non ha caratteri maiuscoli nella sua stringa –

2

Sono riuscito a risolvere questo problema realizzando che la documentazione è leggermente fuorviante. È necessario disporre di un nome file per l'asset zippato correlato al nome del database. Ad esempio, se il tuo database è chiamato someData.db, il tuo file zip deve essere someData.zip.

Inoltre, sembra esserci un po 'di diagnostica migliore se si prova ad aprire un db scrivibile. Ho fatto nel costruttore, come segue, che è stato ciò che alla fine mi ha aiutato a capire la soluzione.

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

rinominare il mio db che ha il carattere CAP in prima lettera? e risolto .. questo è vero? –

6

Ho avuto lo stesso problema.

Che risolto, stava sostituendo

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

con

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

Il mio db è in "/ data/data/YOUR_PACKAGE/files /". Deve essere in una sottocartella "database"? – gdbj

+0

Sì, mettilo nella cartella 'databases' – SteBra

+0

Finalmente ho il mio per funzionare. volevo tornare indietro che funziona bene nella sottocartella "file". – gdbj

2

Assicurarsi che si sta chiudendo tutto il vostro cursore e le istanze db. Ho avuto questo errore a causa di più inserimenti e aggiornamenti e non chiudendo i cursori, causando perdite di cursore e impossibilità di aprire il db.

+0

grazie! aggiungendo cursor.close() mi ha aiutato. –