0

データベースから Android の連絡先に直接アクセスしたい。そのために私は

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

しかし、例外 android.database.sqlite.SQLiteCantOpenDatabaseException で失敗し、データベースを開けません。なぜこうなった?そのファイルには、必要なデータが正確に含まれています。

2 番目の質問: 連絡先のデータベース ファイルへのパスを取得するにはどうすればよいですか?今後のバージョンではおそらく異なる可能性があります。

4

3 に答える 3

2

Android の連絡先は、sqlite データベースに格納され、contacts.dbという名前のファイルです。

開発ツールの Android Debug Bridge (ADB) を使用して、エミュレーターからファイルを抽出できます。

ADBは電話からファイルを抽出することもできますが、最初にルート化する必要があり、ADBドライバーもマシンにインストールする必要があります

(ContentProvider を使用して、Android の連絡先にアクセスできます。)

contact.dbファイルは、保護されたシステム メモリに保存されます。ファイル パスは次のとおりです。

データ/データ/com.android.providers.contacts/databases/contacts.db

于 2013-01-22T10:34:08.970 に答える
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();
    }
于 2013-01-22T09:52:23.707 に答える
0

連絡先データベースに接続する場合は、マニフェストに「READ_CONTACTS」権限が必要です。連絡先データベースは /data/data/com.android.provider.contacts の場所にあり、ルート権限がないとアクセスできません。唯一の解決策は、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);

    }

お役に立てば幸いです。

于 2013-01-22T09:37:37.200 に答える