2011-03-24 98 views
0

我想读取(只)从data/data/com.android.providers.telephony/databases/mmssms.db记录(我不知道官方的API等,但因为它缺乏官方API我必须这样做)。我以为我可以像在过去的答案写How to access an existing sqlite database in Android?,只是android SQLite读取访问

SQLiteDatabase db = SQLiteDatabase.openDatabase("data/data/com.android.providers.telephony/databases/mmssms.db ", null, 0); 

但系统无法打开DB文件。接下来,我想我可能需要创建一个完全成熟的DB Helper类

package com.test.dbaccess; 


import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 

public class DbAdapterMms 
{ 
    private final Context ctx; 
    private DatabaseHelper dbHelper; 
    public SQLiteDatabase db; 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     private final Context ctx; 

     DatabaseHelper(Context context) 
     { 
      super(context, "data/data/com.android.providers.telephony/databases/mmssms.db", null, 1); 

      this.ctx = context; 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
      //do nothing, this should exist 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
     { 
      //do nothing, reading only 
     } 


    } 

    public DbAdapterMms(Context context) 
    { 
     this.ctx = context; 
    } 

    public void open() 
    { 
     dbHelper = new DatabaseHelper(ctx); 
     db = dbHelper.getReadableDatabase(); 
    } 

    public void close() 
    { 
     dbHelper.close(); 
    } 
} 

它仍然无法正常工作,这个时候我想可能是在调用super的问题();因为那里必须提供DBVersion。我不知道的版本,我只想读取现有的数据库。不能成为火箭......

任何帮助吗? 谢谢,答:

+1

请不要搞乱其他应用程序的数据库。你可能会争辩说你只想阅读。但是,你的崇高意图不会阻止别人想到别的东西,这会让分贝腐败。因此,为了防止这种行为(自愿或不愿意),直接访问其他应用程序受到限制。虽然,您可以根据您的电话并承担风险和责任 – 2011-03-24 10:11:14

回答

1

您可以使用像这样打开smsmms数据库

Cursor cSys = getContentResolver().query("content://mms-sms",null, null, null,null); 

使用此光标,你可以操纵数据库。

getting list of mms

+0

03-24 11:35:09.454:错误/ DatabaseUtils(133):java.lang.IllegalStateException:无法识别的URI:content:// mms-sms。我不得不将你的代码改为Cursor cSys = getContentResolver()。任何想法来实现这一目标? – AndyAndroid 2011-03-24 10:37:28

2

我想你不能读取另一个应用程序的数据库。在Android中,每个应用程序在文件系统上都有自己的存储位置,无法从其他进程访问它。唯一的例外是,如果在清单文件中定义了允许其他应用程序访问数据。当您试图访问您不拥有的应用程序的数据时,您无法编辑其清单文件以授予您对数据的访问权限。

读取数据库的唯一方法是,如果你有一个扎根的手机。然后,您可以将数据库拉到您的PC上,并将其推回到您的应用商店中。但我认为这不是你想要的。