2013-07-10 5 views
0

EDIT: Enlevé code précédent pour plus de clartéBase de données SQLite n'existe pas Android

Sur suggestion, j'ai ajouté des messages du journal pour voir où je suis se boucha.

Il semble qu'il est de lancer correctement l'appel à checkDatabase(), mais ne retourne pas à copier la base de données. Ceci est ma méthode checkDatabase():

File dbFile = new File(DB_PATH + DB_NAME); 
     if(dbFile.exists()){ 
      Log.d("True","Returned true"); 
      return true; 

     }else{ 
      dbFile.getParentFile().mkdirs(); 
      Log.d("CreatedPath","Made the right directory"); 
      return false; 
     } 

Dans les journaux de débogage je peux voir mon message « créé Path ». Donc ça va si loin.

Il retourne alors faux, ce qui devrait commencer ceci:

public void createDataBase() throws IOException{ 

     boolean dbExist = checkDatabase(); 
     if (!dbExist){ 

      this.getReadableDatabase(); 

      // Calling this method an empty database will be 
      // created into the default system path of 
      // the app so we can overwrite with FirstDB. 


      try{ 

       copyDatabase(); 

      }catch (IOException e) { 
       throw new Error("Error copying database"); 

      } 
     } 
    } 

Cependant, je ne vois les messages du journal du tout. C'est comme si cela renvoyait faux et continue de bouger. J'ai besoin de rappeler le createDataBase()?

+0

S'il vous plaît envisager d'utiliser le 'SQLiteAssetHelper' testé, débogué et pris en charge à la place de ce code: https://github.com/jgilfelt/android-sqlite-asset-helper – CommonsWare

+0

Cela n'a pas fonctionné. Même un peu. – Phoenix

+0

Cela fonctionne pour beaucoup d'autres personnes, contrairement à la base de code à partir de laquelle vous travaillez, avec laquelle beaucoup de gens ont des problèmes, comme en témoignent toutes les questions de StackOverflow à ce sujet. – CommonsWare

Répondre

2

Je vais essayer ceci:

D'abord, changer cette chaîne de chemin

private static String DB_PATH = "/data/data/com.example.mydbapp/databases/"; 

Ensuite, faire la même vérification du fichier, mais faites le répertoire s'il n'existe pas. Vous devez de toute façon; C'est là que les bases de données seront sauvegardées par défaut par l'implémentation SQLite d'Android.

Donc, essayez ceci:

private boolean checkDatabase(){ 
    File dbFile = new File(DB_PATH + DB_NAME); 
    if(dbFile.exists()){ 
     return true; 
    } 
    else{ 
     //This'll create the directories you wanna write to, so you 
     //can put the DB in the right spot. 
     dbFile.getParentFile().mkdirs(); 
     return false; 
    } 
} 

Quoi qu'il en soit, c'est juste d'un peu de googler, et ce que je sais du haut de ma tête. Liens en bas.

De plus, je suis un peu confus:

//YOU NAME THIS myInput: 
    InputStream myInput = firstDBContext.getAssets().open(DB_NAME); 
    String outFileName = DB_PATH + DB_NAME; 
    OutputStream bnOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024]; 
    int length; 
    //YOU READ FROM bnInput: 
    while ((length = bnInput.read(buffer)) > 0){ 
     bnOutput.write(buffer, 0, length); 
    } 

Peut-être qu'il ya quelque chose que je manque ici, mais ne sont pas vous en train de lire deux InputStreams différents? Je ne comprends pas pourquoi vous appelez cette fonction dans createDatabase():

this.getReadableDatabase(); 

Cette fonction appellera onCreate, qui appelle createDatabase, qui appellera à nouveau onCreate si checkDatabase() retourne false, de ce que je peux dire . Liens vers ce que je googlé:

Java's createNewFile() - will it also create directories?

https://stackoverflow.com/a/9865386/2015759

http://docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdirs%28%29

Create intermediate folders if one doesn't exist

Bonne chance.

+0

Merci pour l'explication. Votre confusion est correcte, c'était une faute de frappe d'une version précédente de la tentative. J'ai tendance à nommer vaguement toutes mes variables, et j'essayais de mettre à jour ici pour le rendre compréhensible pour le lecteur. J'ai fait les changements que vous avez suggérés, toujours avec le même résultat. Impossible d'ouvrir la base de données. Quelque chose s'arrête avant la création, j'ai vérifié File Explorer et le répertoire n'existe pas. Si tel n'est pas le cas, il n'appuie même pas sur la méthode 'createDataBase()', car le premier appel dans this est le 'checkDatabase();' qui créerait le répertoire et retournerait false. Pensées? – Phoenix

+0

Ajoutez des appels à logcat lorsque vous pensez qu'il se bloque. Put: Log.d ("MESSAGE_TAG_HERE", "MESSAGE_HERE"); Par exemple, dans checkDatabase, dans la condition if (db.exists()), mettez ce code Log.d, avec un message de "db exists!" Etc, etc. En outre, dans le logcat que vous avez posté, il indique qu'il y a une erreur à la ligne 100 de DBSQLiteHelper, votre fichier. C'est dans la fonction openDatabase. Peut-être que vous trouverez quelque chose là-bas, je ne sais pas. –

+0

Bonne idée. Je suis sur le point de devenir fou, j'ai essayé de faire fonctionner ce travail pendant 3 jours, et j'ai passé plusieurs heures aujourd'hui à essayer de trouver des solutions. – Phoenix

1

Désinstallez l'application de votre appareil et réessayez mais ajoutez /databases/ à votre DB_PATH.

private static String DB_PATH = "/data/data/com.example.mydbapp/databases/";

Comme fas que je sais que ce devrait être toujours là et je ne vois pas sur votre méthode createDatabase.

Essayez plus tard d'accéder via sqlite3 pour vérifier s'il est correctement créé.

According to docs

Pour utiliser sqlite3, entrez un shell distant sur l'instance de l'émulateur, tel que décrit ci-dessus, puis invoquer l'outil en utilisant la commande sqlite3. En option, lorsque vous appelez sqlite3, vous pouvez spécifier le chemin d'accès complet à la base de données que vous souhaitez explorer. Les instances d'émulateur/périphérique stockent des bases de données SQLite3 dans le dossier /data/data/< nom_package>/databases/.

Voici un exemple:

adb -s emulator-5554 shell 
# sqlite3 /data/data/com.example.mydbapp/databases/FirstDB.db`