2016-07-25 39 views

回答

0

使用机器人内容提供商获取联系人数据的光标,然后遍历光标行和保存数据的SQLite

首先添加权限: -

<uses-permission android:name="android.permission.READ_CONTACTS" > 
</uses-permission> 

然后在Java类: -

Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null); 
while (phones.moveToNext()) 
{ 
    String name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
    String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 

} 
phones.close(); 

在while循环中添加到您的sqlite数据库

+0

有没有办法直接从ContactsContracts.data获取数据? – user6633315

0

我有这样的我与getContentResolver()的麻烦。 我得到的错误 android.content.Context.getContentResolver()”上一个空对象引用

public class DatabaseHelper extends SQLiteOpenHelper { 

public static final String DATABASE_NAME = "EventBoard.db"; 
public static final String EVENTS_TABLE = "Events"; 
public static final String GUESTS_TABLE = "Guests"; 

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

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table " + EVENTS_TABLE + "(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name TEXT,Time TEXT,Date TEXT,Venue TEXT,Contact TEXT,Description TEXT);"); 
    db.execSQL("create table " + GUESTS_TABLE + "(Name TEXT,Phone TEXT,Email TEXT);"); 
    createGuestsTable(this); 
} 

这是我createGuestsTable(上下文的背景下)方法

public void createGuestsTable(Context context){ 
    Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null); 
    while(phones.moveToNext()){ 
     String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
     String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     String email = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS)); 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put("Name", name); 
     contentValues.put("Phone", phoneNumber); 
     contentValues.put("Email", email); 
     db.insert(GUESTS_TABLE,null,contentValues); 
    } 
} 
+0

您的上下文传递存在一些问题。 –

+0

是你的DatabaseHelper类和这个方法createGuestsTable在单独的java文件,然后主要活动文件? –

+0

yes databasehelper是一个单独的java文件,createGuestsTable是这个java文件的一个方法 – user6633315

0

试着这样做: -

public class DatabaseHelper extends SQLiteOpenHelper { 

public static final String DATABASE_NAME = "EventBoard.db"; 
public static final String EVENTS_TABLE = "Events"; 
public static final String GUESTS_TABLE = "Guests"; 
public Context ctx; 

public DatabaseHelper(Context context) { 
    ctx = context; 
    super(context, DATABASE_NAME, null, 1); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table " + EVENTS_TABLE + "(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name TEXT,Time TEXT,Date TEXT,Venue TEXT,Contact TEXT,Description TEXT);"); 
    db.execSQL("create table " + GUESTS_TABLE + "(Name TEXT,Phone TEXT,Email TEXT);"); 
    createGuestsTable(ctx); 
} 
+0

'public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); //删除标题 requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow()。setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); myDb = new DatabaseHelper(this); myDb.createGuestsTable(this); }' 这就是我所做的。我在我的MainActivity而不是DatabaseHelper类中调用了我的方法。它的工作......这是一个好习惯吗? – user6633315

+0

你正在做的代码很好。为了组织你的代码,为你的任务创建一个单独的类是一个好习惯。但是由于数据库写入只有一小部分代码,所以您可以继续使用一个java文件。 –

+0

如果你想为这个单独的文件,那么我认为我的上面的代码应该工作。您在空指针异常中遇到的唯一问题是上下文。因此传递主要活动上下文 –

相关问题