web-dev-qa-db-ja.com

警告:「/ data /」をハードコーディングしないでください。代わりにContext.getFilesDir()。getPath()を使用してください

データベースをアセットフォルダーからハードコードされたパスにコピーするアプリケーションを開発しました。だからEclipseは私に警告を与えます:

Do not hardcode "/data/"; use Context.getFilesDir().getPath() instead

私はグーグルで検索し、使用するための答えを見つけました:

Context.getFilesDir().getPath();

また、ハードコーディングがすべてのデバイスで機能しているわけではなく、一部のデバイスでは、エラーが発生したり、正しく機能しない場合があります。しかし、上記を実装することにより、エラーが発生します。

私のコードは次のとおりです:

private final Context myContext;

ここで警告を表示

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


private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_NAME = "exampledb.sqlite";
static SQLiteDatabase sqliteDataBase;

public DataBaseHelperClass(Context context) {       
    super(context, DATABASE_NAME, null ,DATABASE_VERSION);
    this.myContext = context;
}

public void createDataBase() throws IOException{
    boolean databaseExist = checkDataBase();

    if(databaseExist){
        this.getWritableDatabase();
    }else{
        this.getReadableDatabase();         
        copyDataBase(); 
    }
} 


public boolean checkDataBase(){
    File databaseFile = new File(DB_PATH + DATABASE_NAME);
    return databaseFile.exists();        
}

private void copyDataBase() throws IOException{ 
    InputStream myInput = myContext.getAssets().open(DATABASE_NAME); 
    String outFileName = DB_PATH + DATABASE_NAME; 
    OutputStream myOutput = new FileOutputStream(outFileName); 
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    myOutput.flush();
    myOutput.close();
    myInput.close(); 
}


public void openDataBase() throws SQLException{      
    String myPath = DB_PATH + DATABASE_NAME;
    sqliteDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);  
}

@Override
public synchronized void close() { 
    if(sqliteDataBase != null)
        sqliteDataBase.close(); 
    super.close(); 
}

public Cursor myFunction(){

}

@Override
public void onCreate(SQLiteDatabase db) {}

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

警告を解決する方法を教えてください。

16
Manoj Fegde

Eclipseが提供するヒントだけでは十分ではありません。

データベースパスはcontext.getDatabasePath();で取得できます。ファイルに目的の名前を渡す必要があります(ファイルが存在するかどうかは関係ありません)。この場合はexampledb.sqlite

したがって、コードは次のようになります。

File outFile =myContext.getDatabasePath(DATABASE_NAME);
String outFileName =outFile.getPath() ;

もちろん、myContextは現在のコンテキストである必要があります。これは、たとえば、これを呼び出している実行中のアクティビティまたはサービスです。

24
Carlos Robles

次のようにします:

public DataBaseHelperClass(Context context) {       
    super(context, DATABASE_NAME, null ,DATABASE_VERSION);
    this.myContext = context;
    //The Android's default system path of your application database.
    DB_PATH = myContext.getDatabasePath(DATABASE_NAME).getPath();
}

エラーや警告は表示されません。

5
Optim India

アクティビティ/アプリのコンテキストを使用して、次のようなパスを取得します。

Context c = getApplicationContext();
c.getFilesDir().getPath();
2
insomniac