2013-01-22 32 views
0

我想直接通过数据库访问Android联系人。对于我Android联系人 - SQLite数据库连接失败

SQLiteDatabase data=null; 
File file = new File(".... some path ... contacts2.db"); 
data = SQLiteDatabase.openOrCreateDatabase(file, null); 

但它失败的异常android.database.sqlite.SQLiteCantOpenDatabaseException无法打开数据库。这是为什么发生?该文件完全包含所需的数据。

第二个问题是:我如何才能获取联系人数据库文件的路径,在更多版本中可能会有所不同?

+0

我写答案给你 – TN888

回答

0

如果要连接到联系人数据库,则必须在清单中具有“READ_CONTACTS”权限。联系人数据库位于/data/data/com.android.provider.contacts位置,如果没有root权限,则无法访问它们。唯一的解决方案是使用ContactContract和managedQuery。我给你代码示例。

public void kontakt() 
    { 
     Cursor k = this.kontakty(); 
     int a = k.getCount(); 
     while(k.moveToNext()) 
     { 

      String s = k.getString(k.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
      tv.append(s); 
      tv.append("\n"); 

     } 

    } 




    @SuppressWarnings("deprecation") 
    public Cursor kontakty() 
    { 
     Uri u = ContactsContract.Contacts.CONTENT_URI; 
     String[] cochcemy = {ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME}; 
     return managedQuery(u, cochcemy, null, null, null); 

    } 

我希望我帮了忙。

+1

谢谢你的提醒,它的工作原理,但我的问题仍然是相同的 - 如何对数据库执行rawQuery?我有一个复杂的SQL查询。 “READ_CONTACTS”权限已在清单中。 – Catherine

+0

请阅读有关数据库结构的信息:http://developer.android.com/guide/topics/providers/contacts-provider.html。你可以改变这一行“return managedQuery(u,cochcemy,null,null,null);”到“返回rawQuery(”QUERY“);” – TN888

+0

但我的方法是最好的 – TN888

0
public class DatabaseHelper extends SQLiteOpenHelper { 


    private static final String DATABASE_NAME = "upgrade.db"; 
    public static final String TITLE = "title"; 
    public static final String AUTHOR = "author"; 
    public static final String ISBN = "isbn"; 
    public static final String CITY = "city"; 
    public static final String CITY2 = "city2"; 



    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null,3); 

    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 

     db.execSQL("CREATE TABLE books (id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT ,author TEXT,isbn TEXT,city TEXT);"); 


     Log.v("onCreate-------","called onCreate"); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     android.util.Log.w("books", 
     "Upgrading database, which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS books"); 
    onCreate(db); 
     Log.v("onUpgrade-------","called onUpgrade with alter"); 
    } 
} 
其他类

您可以拨打: -

public void onLoad(View v) 
    { 

     DatabaseHelper dbh = new DatabaseHelper(this); 
     SQLiteDatabase sl = dbh.getReadableDatabase(); 


     Cursor c = sl.rawQuery("select * from books",null); 

     c.moveToFirst(); 
     /* here your code to fetch data*/ 


     Toast.makeText(this,"hello",Toast.LENGTH_SHORT).show(); 
     sl.close(); 
    } 
+0

这个问题不好回答... – TN888

+0

我得到了同样的异常。 – Catherine

+0

普通人,我使用相同的..我给你什么。 – Unknown

2

联系人在android系统是存储在SQLite数据库和文件命名为contacts.db

开发工具的Android调试桥(ADB )可用于从EMULATOR中提取文件。ADB也可以从手机中提取文件,但它必须是root的f IRST和ADB驱动器必须安装在您的machibe以及

(可以使用的ContentProvider访问Android通讯录。)

contacts.db文件存储在受保护的系统内存,文件路径是:

数据/数据/ com.android.providers.contacts /数据库/ contacts.db

+0

我在文件系统中看不到这样的文件。但contacts2.db文件存在。我使用模拟器 – Catherine