android openOrCreateDatabase仅适用于模拟器

时间:2012-08-07 20:54:26

标签: android sqlite ddms

我注意到,当我右键单击项目并“运行为Android应用程序”时,openOrCreateDatabase只能在模拟器中运行,而不能在手机上运行。我检查了DDMS,数据库是通过模拟器成功创建的,但不是实际的设备。在手机上测试时,我根本没有收到任何错误消息。是的,我确实知道数据库帮助程序类,我也尝试过,没有错误消息。所以我想知道,是否存在权限问题?是否需要设置某种配置,以便在手机上进行测试时创建SQLite数据库?任何帮助表示赞赏。感谢。

P.S。我正在关注本教程:http://www.youtube.com/watch?v=OUoGnvz_Yw4


编辑添加代码: 这是...在模拟器中工作正常,设备上没有任何反应。任何帮助表示赞赏。再次感谢。

package com.solitario.dbtest1;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SQLiteDatabase db = this.openOrCreateDatabase("dbtest1.db",MODE_PRIVATE,null);
        db.execSQL("CREATE TABLE IF NOT EXISTS FunnyNames (email VARCHAR, firstName VARCHAR, lastName VARCHAR);");
        db.close();
    }
}

编辑以回应Rob的问题: 密切关注我的LogCat,我看到以下两行:

08-07 21:44:33.439: D/Database(2936): dbopen(): path = /data/data/com.solitario.dbtest1/databases/dbtest1.db, flag = 6
08-07 21:44:33.439: D/Database(2936): dbopen(): path = /data/data/com.solitario.dbtest1/databases/dbtest1.db, free size = 888

我试图通过在我的终端中输入数据来拉取数据库,并获得“权限被拒绝。”

solitario@ubuntu:~/sdk/platform-tools$ sudo ./adb pull /data/data/com.solitario.dbtest1/databases/dbtest1.db
failed to copy '/data/data/com.solitario.dbtest1/databases/dbtest1.db' to './dbtest1.db': Permission denied

因此,如果我试图拉出一个不存在的文件,那么终端会给我一个不同的响应,我进入了我的机器人设置,清除了应用程序的数据但没有卸载应用程序。然后再次尝试从终端拉出数据库,并得到一个“不存在。”

solitario@ubuntu:~/sdk/platform-tools$ sudo ./adb pull /data/data/com.solitario.dbtest1/databases/dbtest1.db
remote object '/data/data/com.solitario.dbtest1/databases/dbtest1.db' does not exist

所以看起来它实际上确实创建了数据库,但DDMS不会在创建数据库时向您显示,终端也不允许您拉动它以便查看它。

所以,我想修改我的问题......在构建Android应用程序并在实际设备上进行测试时,如何验证您的命令是否成功?有哪些工具可以验证我的查询是否已在droid上执行?

再次感谢您阅读和回复!

1 个答案:

答案 0 :(得分:2)

要在非root设备上进行调试时要查看数据库,您需要将其复制到公开可见的位置,例如SD卡。

您可以使用以下代码将数据库复制到SD卡(请不要忘记在发货前禁用此代码)。在您要验证数据库所处状态的位置调用此方法。

String sourcePath = "/data/data/com.solitario.dbtest1/databases/dbtest1.db";
File sourceFile = new File(sourcePath);

FileInputStream fis = new FileInputStream(sourceFile);

String outFilePath = Environment.getExternalStorageDirectory() + "/dbtest1.db";

OutputStream output = new FileOutputStream(outFilePath);

byte[] buff = new byte[1024];
int len;
while ((len = fis.read(buff)) > 0) {
    output.write(buff, 0, len);
}
output.flush();
output.close();
fis.close();

如果您的设备中没有SD卡,则可能需要修改输出目录。

将它放在SD卡上后,您可以使用Eclipse中的DDMS将其复制到开发机器上。

在您的开发计算机上SQLite DB browser可以打开数据库并浏览/查询它等。