我正在使用SQLiteOpenHelper来创建我的数据库。我改变了这样的构造函数:
public SQLite(Context context){
super(context, "/mnt/sdcard"+DATABASE_NAME+".db", null, DATABASE_VERSION);
}
数据库在公共目录中创建就好了。问题是,当我尝试执行函数时,我无法将数据库更改为我在公共目录中创建的数据库。我怎么能改变这个?例如:
@Override
public void onCreate(SQLiteDatabase db){
Log.i("DB PATH", db.getPath());
}
打印出来:
DB PATH - /data/data/package_name/databases/database_name
我需要打印出公共数据库的路径。
提前谢谢。
修改
将私人数据库复制到公共目录
将构造函数更改为:
public SQLite(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
使用了Geralt建议的链接中的代码:
private void copyDataBase(String dbname) throws IOException {
// Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(dbname);
// Path to the just created empty db
String outFileName = "/data/data/com.sample.view/databases/" + dbname;
// 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();
}
以下是发生的事情的堆栈跟踪:
04-15 09:57:55.275: W/ResourceType(11994): Invalid package identifier when getting bag for resource number 0xffffffff
04-15 09:57:55.275: W/ResourceType(11994): Invalid package identifier when getting bag for resource number 0xffffffff
04-15 09:57:55.275: W/ResourceType(11994): Invalid package identifier when getting bag for resource number 0xffffffff
04-15 09:57:55.320: W/System.err(11994): java.io.FileNotFoundException: aCollectDatabase
04-15 09:57:55.320: W/System.err(11994): at android.content.res.AssetManager.openAsset(Native Method)
04-15 09:57:55.320: W/System.err(11994): at android.content.res.AssetManager.open(AssetManager.java:315)
04-15 09:57:55.320: W/System.err(11994): at android.content.res.AssetManager.open(AssetManager.java:289)
04-15 09:57:55.320: W/System.err(11994): at co.za.datasolve.acollect.ACollectActivity.copyDataBase(ACollectActivity.java:184)
04-15 09:57:55.320: W/System.err(11994): at co.za.datasolve.acollect.ACollectActivity.onCreate(ACollectActivity.java:153)
这就是问题所在:
InputStream myInput = getApplicationContext().getAssets().open(dbname);
有没有人建议我如何解决这个问题?
答案 0 :(得分:2)
我改变了这样的构造函数:
问题是在构造函数中,您只指定数据库名称和不是路径。出于安全原因,SQLiteOpenHelper
创建的数据库将始终放在内部存储中 - 您无法更改此逻辑。它是OS的内置逻辑。
您可以做的就是将您的数据库显式复制到另一个目录中。
In this thread您将找到如何复制数据库。
<强>更新强>
以下是获取数据库路径的方法:
String path = getApplicationContext().getDatabasePath("your_database_name");
答案 1 :(得分:0)
您应该使用Environment.getExternalStorageDirectory()
获取外部存储路径。
使用此:
public SQLite(Context context){
super(context, Environment.getExternalStorageDirectory() + File.Separator +
DATABASE_NAME+".db", null, DATABASE_VERSION);
}
不要硬编码路径。