Android更改数据库路径问题
在自定义的Android更改数据库路径问题,android,sqlite,storage,Android,Sqlite,Storage,在自定义的databaseHelper.class中更改数据库路径时,我遇到了一个小问题。因此,在开始时,我将数据库放在内部存储的默认数据库文件夹中,但现在我想将其放在文件/文档/用户/服务器名/数据中,但当我更改初始化存储路径的字符串时,放在那里的数据库是空的。我忘了提到,实际上我在应用程序的资产文件夹中有sqlite文件,我正在将该文件从那里复制到我的内存中。下面是我正在使用的一段代码: private static final int DATABASE_VERSION = 1; priva
databaseHelper.class
中更改数据库路径时,我遇到了一个小问题。因此,在开始时,我将数据库放在内部存储的默认数据库文件夹中,但现在我想将其放在文件/文档/用户/服务器名/数据中,但当我更改初始化存储路径的字符串时,放在那里的数据库是空的。我忘了提到,实际上我在应用程序的资产文件夹中有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\u PATH\u后缀
更改为:/files/documents/users/servername/data
,我在那里的数据库是空的,并且没有在文件from assets文件夹中创建的表
你知道怎么解决吗 不清楚文件/文档/用户/服务器名/数据是否与应用程序或根文件系统相关
经验法则:不要使用指向根文件系统的绝对路径名。曾经事情会破裂,最终变成愚蠢的虫子
要获取应用程序的根目录,请使用以下命令:
String ROOT_DIR = context.getFilesDir().getAbsolutePath();
从那里,将数据库移动到您想要的任何位置(在应用程序的存储树下)。您应该覆盖活动中的getDatabasePath()
方法
@Override
public File getDatabasePath(String name)
{
//blah-blah
}
实际上现在我数据库文件夹的路径是data/data/app\u package\u name/databases
,我想把文件复制到data/data/app\u package\u name/files/documents/users/data
,但实际上你的代码甚至没有创建目录,也没有将空文件复制到databases
目录。你知道哪里会是我的错吗?可能对你有用。