Подтвердить что ты не робот

Предупреждение: не печатайте "/data/"; вместо этого используйте Context.getFilesDir(). getPath()

Я разработал приложение, в котором я скопировал базу данных из папки с ресурсами на мой путь, который является жестко запрограммированным. Поэтому eclipse предупреждает меня:

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

Я искал в google и нашел ответ на использование:

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) {} 

Пожалуйста, предложите мне способ разрешения предупреждения.

4b9b3361

Ответ 1

Кончик, который дает вам затмение, недостаточно хорош.

Вы можете получить путь к базе данных с помощью context.getDatabasePath(); вы передаете искомое имя в файл (независимо от того, существует он или нет). в вашем случае "exampledb.sqlite"

поэтому ваш код будет:

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

конечно, myContext должен быть текущим контекстом. Это, т.е. Текущая деятельность или служба, вызывающая это.

Ответ 2

Сделайте следующее:

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

Вы не получите ошибку или предупреждение.

Ответ 3

Просто используйте контекст активности/приложения для получения пути:

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