Предупреждение: не печатайте "/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) {}
Пожалуйста, предложите мне способ разрешения предупреждения.
Ответы
Ответ 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();