gpt4 book ai didi

android - 将 SQlite 数据库复制到公共(public)目录(非根设备)

转载 作者:行者123 更新时间:2023-11-29 00:21:10 25 4
gpt4 key购买 nike

我正在使用 SQLiteOpenHelper 创建我的数据库。我像这样更改了构造函数:

public SQLite(Context context){
super(context, "/mnt/sdcard"+DATABASE_NAME+".db", null, DATABASE_VERSION);
}

数据库在public目录下创建就好了。问题是当我尝试执行函数时,我无法将数据库更改为我在公共(public)目录中创建的数据库。我怎样才能改变这个?例如:

@Override
public void onCreate(SQLiteDatabase db){
Log.i("DB PATH", db.getPath());
}

打印出来:

DB PATH - /data/data/package_name/databases/database_name

我需要它来打印出公共(public)数据库的路径。

提前谢谢你。

编辑

将私有(private)数据库复制到公共(public)目录

将构造函数更改为:

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);

有人对我如何解决这个问题有建议吗?

最佳答案

I changed the constructor like this:

问题是在构造函数中您只指定了数据库名称不是路径。出于安全原因,由 SQLiteOpenHelper 创建的数据库将始终放置在内部存储中 - 您无法更改此逻辑。这是操作系统的内置逻辑。

您所能做的就是明确地将您的数据库复制到另一个目录中。

In this thread您将找到如何复制数据库。

更新:

获取数据库路径的方法如下:

String path = getApplicationContext().getDatabasePath("your_database_name");

关于android - 将 SQlite 数据库复制到公共(public)目录(非根设备),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23076645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com