2017-10-15 17 views
-1

J'ai copié une base de données à partir du stockage interne à externe, mais il semble que quelque chose n'allait pas. Parce qu'il n'y a pas de table dedans. Je sens juste qu'un fichier vide est créé. Pendant ce temps, j'ai utilisé ActiveAndroid pour créer le fichier de base de données source et utiliser Filechanel pour copier le fichierJ'ai copié la base de données sur le stockage externe. mais il n'a pas de tables source

public class DbExportImport { 

/** Directory that files are to be read from and written to **/ 
protected static final File DATABASE_DIRECTORY = 
     new File(Environment.getExternalStorageDirectory(),"mydirectory"); 

public static final String PACKAGE_NAME = "example.com.testp"; 

public static final String DATABASE_NAME = "database1.db"; 

/** Contains: /data/data/com.example.app/databases/example.db **/ 
private static final File DATA_DIRECTORY_DATABASE = 
     new File(Environment.getDataDirectory() + 
       "/data/" + PACKAGE_NAME + 
       "/databases/" + DATABASE_NAME); 

public static boolean exportDb(){ 

    // if external torage is present 
    if(! SdIsPresent()) return false; 

    File dbFile = DATA_DIRECTORY_DATABASE; 

    String filename = "backupdb.db"; 

    File exportDir = DATABASE_DIRECTORY; 

    File file = new File(exportDir, filename); 

    if (!exportDir.exists()) { 
     exportDir.mkdirs(); 
    } 

    try { 
     file.createNewFile(); 
     copyFile(dbFile, file); 
     return true; 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return false; 
    } 
} 


private static void copyFile(File src, File dst) throws IOException { 

    FileChannel inChannel = new FileInputStream(src).getChannel(); 

    FileChannel outChannel = new FileOutputStream(dst).getChannel(); 

    try { 
        inChannel.transferTo(0, inChannel.size(), outChannel); 
    } finally { 
     if (inChannel != null) 
      inChannel.close(); 
     if (outChannel != null) 
      outChannel.close(); 
    } 
} 
+0

Qu'est-ce qui vous fait penser qu'il n'a pas de tables? Aucun du code ci-dessus n'essaie de regarder la base de données comme une base de données sqlite qu'il traite simplement comme un fichier ordinaire. – MikeT

+0

bonjour. Je vois dans la base de données copiée avec sqlite3 programme de ligne de commande. mais il n'y a pas de table dedans. – hassan

+0

Vous avez probablement ouvert la base de données avec une commande/méthode sqlite lorsqu'elle n'existait pas et donc la base de données a été créée sans tables. par exemple. 'SQLiteDatabase db = openOrCreateDatabase (" mydb ", MODE_PRIVATE, null);' fera exactement cela. – MikeT

Répondre

0

Je ne sais pas de la même chose sur tous les appareils (j'utilise LG SmartPhone pour tester) Le problème était l'extension du fichier (.db). Nous ne devrions pas l'écrire pour accéder à la base de données dans le stockage privé/données/données ... J'ai utilisé context.getDatabasePath() pour obtenir le chemin de la base de données d'une manière sûre. en fonction exportDb i utiliser copyFile(context.getDatabasePath("database1"),file) au lieu de copyFile(dbFile, file); ou vous pouvez changer public static final String DATABASE_NAME = "database1.db";-public static final String DATABASE_NAME = "database1"; Mais la première approche semble être plus sûr