android openOrCreateDatabase 仅适用于模拟器

标签 android sqlite ddms

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

附言我正在关注本教程: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 应用程序并在实际设备上进行测试时,如何验证您的命令是否成功?有什么工具可以验证我的查询是否已在机器人上执行?

再次感谢您的阅读和回复!

最佳答案

要在非 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可以打开数据库并浏览/查询它等。

关于android openOrCreateDatabase 仅适用于模拟器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11853983/

相关文章:

android - 我如何捕获图像并保存在我的 Activity 中的 ImageView 中?

android - 使用opencv进行文档轮廓检测

sqlite - 基于纬度/经度查询附近兴趣点的 SQL 查询 - SQLite

SQLITE:替换而不使用 auto_increment

DDMS : Issue? 或安全原因中的 Android 黑色屏幕截图?

android - 在 Android 中滑动页面

android - DialogFragment 参数和空指针异常

c++ - SQLDataBase setDatabaseName 在 QT 中不起作用

android - 使用命令提示符从 DDMS 中删除文件?

android - 无法在 Eclipse 的 DDMS 透视图中选择我的 Android 客户端