2016-06-22 24 views
1

私はAndroidでSQLiteデータベースの実装が新しくなったので、何か見落としたかもしれません。私はSQLiteOpenHelperを拡張するクラスでSQLiteのデータベース作成しました:SQLiteデータベースがファイルシステムで見つからないのはなぜですか?

public class DB extends SQLiteOpenHelper { 
    private static final String DATABASE_NAME = "/mnt/sdcard/db/db.sqlite"; 
    private static final int DATABASE_VERSION = 1; 
    private static final String TEXT_TYPE = " TEXT"; 
    private static final String COMMA_SEP = ","; 

    public static final String TABLE_EXTRA_DATA = "extra_data"; 
    public static final String KEY_ID = "id"; 
    public static final String KEY_LINKED_ORDER_NUMBER = "linked_order_number"; 
    public static final String KEY_DATE = "date"; 
    public static final String KEY_ARRIVAL_TIME = "arrival_time"; 
    public static final String KEY_ARRIVAL_IMPORTANT = "arrival_important"; 
    public static final String KEY_CLIENT_NAME = "client_name"; 

    public static final String CREATE_TABLE_EXTRA_DATA = "CREATE TABLE IF NOT EXISTS " + 
      TABLE_EXTRA_DATA + " (" + 
      KEY_ID + " INTEGER PRIMARY KEY," + 
      KEY_LINKED_ORDER_NUMBER + TEXT_TYPE + COMMA_SEP + 
      KEY_DATE + TEXT_TYPE + COMMA_SEP + 
      KEY_ARRIVAL_TIME + TEXT_TYPE + COMMA_SEP + 
      KEY_ARRIVAL_IMPORTANT + TEXT_TYPE + COMMA_SEP + 
      KEY_CLIENT_NAME + TEXT_TYPE + ")"; 

    public static final String DELETE_TABLE = "DROP TABLE IF EXISTS " + TABLE_EXTRA_DATA; 

    private final Activity _context; 

    public DB(Activity context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     _context = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase database) { 
     database.execSQL(CREATE_TABLE_EXTRA_DATA); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL(DELETE_TABLE); 
     onCreate(db); 
    } 

    @Override 
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     onUpgrade(db, oldVersion, newVersion); 
    } 
} 

をそして私は、データベースの操作を使用するようにデータベースのヘルパークラスを持っている:

public class DbHelper { 
    private DB _dbHelper; 
    private SQLiteDatabase _db; 

    public DbHelper(Activity context) 
    { 
     _dbHelper = new DB(context); 
     _db = _dbHelper.getWritableDatabase(); 
    } 

    public void CloseDb() { 
     if (_db != null) 
     { 
      if (_db.isOpen()) 
       _db.close(); 
     } 
    } 

    public void SaveExtraData() { 
     ContentValues cv = new ContentValues(); 
     cv.put(_dbHelper.KEY_ID,"test"); 
     cv.put(_dbHelper.KEY_DATE,"test"); 
     cv.put(_dbHelper.KEY_ARRIVAL_TIME,"test"); 
     cv.put(_dbHelper.KEY_ARRIVAL_IMPORTANT,"test"); 
     cv.put(_dbHelper.KEY_CLIENT_NAME,"test"); 

     _db.insert(_dbHelper.TABLE_EXTRA_DATA, null, cv); 
    } 
} 

データベースとdatabaseHelperを開始するとき、私はエラーを取得していません

if(_db == null) { 
    _db = new DbHelper(this); 
} 
try { 
    _db.SaveExtraData(); 
    _db.CloseDb(); 
} 
catch (Exception e) { 

} 

しかし、私のデバイスのファイルシステム上の任意の場所にデータベースが見つかりません。私はアンドロイドバージョン4.4.3でモトローラTC55でそれをテストしています

何か助けや提案をいただければ幸いです。前もって感謝します!

答えて

1

デフォルトで/data/data/<packageNameOfYourApp>/databases/フォルダにありますが、デバイスがルートされていない限り、このフォルダにアクセスすることはできません。

メソッドSQLiteDatabaseを使用すると、データベースのパスを指定できます。例えば

SQLiteDatabase.openDatabase("/pathToYourDb/yourDBFile.db", null, SQLiteDatabase.CREATE_IF_NECESSARY); 

documentationをチェックしてください。あなたはこのような何かを行うことができSQLiteOpenHelperを使用して

または、:

データベースファイルにアクセスするには、夫婦さまざまな方法があります
public class DBHelper extends SQLiteOpenHelper { 
    public DBHelper(Context context) { 
     super(context, "/pathToYourDb/yourDBFile.db", null, DATABASE_VERSION); 
    } 
} 
0

。あなたは、ローカルマシンにデータベースをコピーするには、次のadbコマンドを使用することができます。

adb exec-out run-as APP_PACKAGE cat databases/DB_NAME.db > filename

別のアプローチは、バックアップを実施し、機能を回復させることです。バックアップを実行するときは、データベースをパブリックな場所にコピーします。復元時には、アプリの場所にコピーしてください。ここにサンプル復元機能があります:

public void restoreDatabase() { 
    try { 
     File sd = Environment.getExternalStorageDirectory(); 
     File data = Environment.getDataDirectory(); 

     if (sd.canWrite()) { 
      String backupDBPath = "//data//YOUR_PACKAGE//databases//DB_NAME.db"; 
      String currentDBPath = "sdcard/BACKUP_NAME.db"; 
      File currentDB = new File(currentDBPath); 
      File backupDB = new File(data, backupDBPath); 

      if (currentDB.exists()) { 
       FileChannel src = new FileInputStream(currentDB).getChannel(); 
       FileChannel dst = new FileOutputStream(backupDB).getChannel(); 
       dst.transferFrom(src, 0, src.size()); 
       src.close(); 
       dst.close(); 
      } 
     } 
    } catch (Exception e) { 
    } 
} 

上記のコードの逆を使ってバックアップしてください。