我在自定义databaseHelper.class
中更改数据库的路径时遇到一些问题。所以在开始时我将数据库放在内部存储中的默认数据库文件夹中,但现在我想将它放在files/documents/users/servername/data
中,但是当我更改初始化我的存储路径的字符串时,放置在那里的数据库是空的。我忘了提到实际上我的应用程序的资产文件夹中有sqlite文件,我正在将文件从那里复制到我的内存中。所以这是我正在使用的一段代码:
private static final int DATABASE_VERSION = 1;
private static String DB_PATH_PREFIX = "/data/data/";
private static String DB_PATH_SUFFIX = "/databases/";
public UserDatabaseHelper(Context context, // String dbname,
CursorFactory factory, int version) {
super(context,"stampii_tpl.sqlite", factory, version);
this.context = context;
Log.i(TAG, "Create or Open database : " + "stampii_tpl.sqlite");
}
private static void copyDataBase(Context aContext)
throws IOException {
// Open your local db as the input stream
InputStream myInput = aContext.getAssets().open("stampii_tpl.sqlite");
// Path to the just created empty db
String outFileName = getDatabasePath(aContext);
Log.i(TAG, "Check if create dir : " + DB_PATH_PREFIX
+ aContext.getPackageName() + DB_PATH_SUFFIX);
// if the path doesn't exist first, create it
File f = new File(DB_PATH_PREFIX + aContext.getPackageName()
+ DB_PATH_SUFFIX);
if (!f.exists())
f.mkdir();
Log.i(TAG, "Trying to copy local DB to : " + outFileName);
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
Log.i(TAG, "DB (" + "stampii_tpl.sqlite" + ") copied!");
}
private static boolean checkDatabase(Context aContext) {
SQLiteDatabase checkDB = null;
try {
String myPath = getDatabasePath(aContext);
Log.i(TAG, "Trying to conntect to : " + myPath);
checkDB = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READONLY);
Log.i(TAG, "Database " + "stampii_tpl.sqlite" + " found!");
checkDB.close();
} catch (SQLiteException e) {
Log.i(TAG, "Database " + "stampii_tpl.sqlite" + " does not exists!");
}
return checkDB != null ? true : false;
}
@SuppressWarnings("unused")
private static String getDatabasePath() {
return getDatabasePath(context);
}
private static String getDatabasePath(Context aContext) {
return DB_PATH_PREFIX + aContext.getPackageName() + DB_PATH_SUFFIX
+ "stampii_tpl.sqlite";
}
如果我尝试将DB_PATH_SUFFIX
更改为:/files/documents/users/servername/data
我所拥有的数据库为空,并且没有在assets文件夹中创建的表。
所以任何想法如何解决?
答案 0 :(得分:0)
目前还不清楚files/documents/users/servername/data
是否与您的应用程序或根文件系统相关。
经验法则:不要使用指向/来自根文件系统的绝对路径名。永远。 将打破并最终陷入愚蠢的错误!
要获取应用程序的根目录,请使用:
String ROOT_DIR = context.getFilesDir().getAbsolutePath();
从那里,将数据库移动到您想要的任何位置(在应用程序的存储树下)。
答案 1 :(得分:0)
您应该在getDatabasePath()
Activity
方法
@Override
public File getDatabasePath(String name)
{
//blah-blah
}