2012-08-07 30 views
1

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

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

编辑回应罗布的问题: 更加注重我的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 

我试图通过键入以下到我的终端拉数据库,并获得了“权限被拒绝”。

[email protected]:~/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 

所以搞清楚终端会给我不同的反应,如果我试图把它不存在的文件,我走进我的机器人设置,清除应用程序的数据,但并没有卸载的应用。然后再次尝试从终端上拉数据库,并得到一个“不存在”。

[email protected]:~/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上执行?

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

+0

您好,我已经与Android的DB工作了公平一点,我不知道如何帮助。在我看来,这个问题是创建和发布你最小的失败例子的好选择。 – James 2012-08-07 21:07:32

+0

发布一些代码,以便我们可以看到你在做什么。 – Barak 2012-08-07 22:11:02

+1

它不是创建数据库,还是只是无法导航到设备上的数据库?在真实(未根据)设备上创建数据库的应用程序目录对您而言不可见。 – Rob 2012-08-08 00:21:29

回答

2

要在无根设备上进行调试时查看数据库,您需要将其复制到公共可见位置,如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可以打开数据库,并浏览/查询它等