Android 将SQlite DB复制到公共目录(非根设备)

Android 将SQlite DB复制到公共目录(非根设备),android,android-sqlite,Android,Android Sqlite,我正在使用SQLiteOpenHelper创建我的数据库。我更改了构造函数,如下所示: public SQLite(Context context){ super(context, "/mnt/sdcard"+DATABASE_NAME+".db", null, DATABASE_VERSION); } 数据库是在公共目录中创建的。问题是,当我尝试执行函数时,我无法将数据库更改为我在公共目录中创建的数据库。我怎样才能改变这个?例如: @Override public void onCr

我正在使用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);
有人建议我如何解决这个问题吗

我更改了构造函数,如下所示:

public SQLite(Context context){
    super(context, "/mnt/sdcard"+DATABASE_NAME+".db", null, DATABASE_VERSION);
}
问题是,在构造函数中,您只指定了数据库名称,而没有指定路径。出于安全原因,
SQLiteOpenHelper
创建的数据库将始终放在内部存储器中-您不能更改此逻辑。它是操作系统内置的逻辑

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

您将了解如何复制数据库

更新:

以下是如何获取数据库路径:

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

您应该使用
Environment.getExternalStorageDirectory()
获取外部存储的路径

使用以下命令:

    public SQLite(Context context){
        super(context, Environment.getExternalStorageDirectory() + File.Separator +  
              DATABASE_NAME+".db", null, DATABASE_VERSION);

    }

不要硬编码路径。

那么你想在另一个目录中创建数据库吗?构造函数正在另一个目录中创建数据库,我需要使用该数据库。我已经编辑了答案。我试着采纳你的建议,但总是出错。查看我的编辑please@Lunchboxcom.sample.view这是您使用软件包所需的唯一示例软件包。这是您获取包裹名称的方式。对不起,我是从您发送给我的链接复制的。我正在输入正确的路径和包名问题是:InputStream myInput=getApplicationContext().getAssets().open(dbname)@便当文件NotFoundException表示文件不在提供的路径中。检查数据库路径是否正确。