Reputation: 41
i'm trying to make a Room database of Contact to know if i can save their conversation in an application to save SMS conversation, but the database doesn't want to work : when i want to insert a contact the app bug and the logcat tell me that :
2019-08-21 16:48:34.865 16177-16215/com.galinette.enregistreursms E/AndroidRuntime: FATAL EXCEPTION: pool-1-thread-1
Process: com.galinette.enregistreursms, PID: 16177
java.lang.NullPointerException: Attempt to invoke interface method 'void com.galinette.enregistreursms.database.contactDao.insertContact(com.galinette.enregistreursms.model.Contact)' on a null object reference
at com.galinette.enregistreursms.database.contactRepository.insertContact(contactRepository.java:32)
at com.galinette.enregistreursms.database.contactRepository.putAllContactFirstTime(contactRepository.java:60)
so why ?
I'm sure of my method Contact.getContacts() because i make a method to put a description of each contact in a text file and it's worked...
First, the contact model :
@Entity (tableName = "Contact")
public class Contact {
@PrimaryKey (autoGenerate = true)
private long id;
private String phoneNumber;
private String contactName;
private boolean isSavable;
public Contact(String contactName, String phoneNumber) {
this.phoneNumber = phoneNumber;
this.contactName = contactName;
this.isSavable = false;
}
public static List<Contact> getContacts(Context ctx) {
List<Contact> list = new ArrayList<>();
ContentResolver contentResolver = ctx.getContentResolver();
Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
if (cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {
Cursor cursorInfo = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null);
InputStream inputStream = ContactsContract.Contacts.openContactPhotoInputStream(ctx.getContentResolver(),
ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, new Long(id)));
Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, new Long(id));
Uri pURI = Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
Bitmap photo = null;
if (inputStream != null) {
photo = BitmapFactory.decodeStream(inputStream);
}
while (cursorInfo.moveToNext()) {
Contact info = new Contact(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)),
cursorInfo.getString(cursorInfo.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) );
// info.photo = photo;
// info.photoURI= pURI;
list.add(info);
}
cursorInfo.close();
}
}
cursor.close();
}
return list;
}
the dao :
@Dao
public interface contactDao {
@Insert
public void insertContact(Contact contact);
@Query("SELECT * FROM Contact")
LiveData<List<Contact>> getAllContacts();
@Update
void updateContact(Contact contact);
@Delete
void deleteContact(Contact contact);
}
and the contactrepository :
public class contactRepository {
private contactDatabase db;
private contactDao contactDao;
public contactRepository (Context context){
db = contactDatabase.getInstance(context);
}
public void insertContact (Contact contact) {
contactDao.insertContact(contact);
}
public void updateContact (Contact contact) {
db.contactDao().updateContact(contact);
}
public LiveData<List<Contact>> getAllContacts(){
return contactDao.getAllContacts();
}
public void deleteContact (Contact contact) {
db.contactDao().deleteContact(contact);
}
public void updateAllContacts (List <Contact> contactList){
for(int i = 0; i<=contactList.size(); i++){
db.contactDao().insertContact(contactList.get(i));
}
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void putAllContactFirstTime(){
List<Contact> contactList = Contact.getContacts(EnregistreurSMS.getAppContext());
for(int i = 0; i<contactList.size();i++) {
this.insertContact(contactList.get(i));
}
}
...
I just want that the dao work...
Thanks for your help !
Upvotes: 0
Views: 707
Reputation: 11
@Database(entities = {Contact.class}, version = 1,exportSchema = false)
public abstract class ContactsDataBase extends RoomDatabase {
private static ContactsDataBase INSTANCE;
public abstract ContactDAO showsDAO();
private static final Object sLock = new Object();
public static ContactsDataBase getInstance(Context context) {
synchronized (sLock) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
ContactsDataBase.class, "contact.db")
.build();
}
return INSTANCE;
}
}
}
and change ContactRepository constructor to the following
public contactRepository (Context context){
db = contactDatabase.getInstance(context);
contactDao = contactDatabase.contactDAO();
}
Upvotes: 1
Reputation: 2361
From the code you've given, it looks like contactDao
in contactRepository
hasn't been instantiated. Unless you call something like contactDao = new ContactDao()
it will be null.
Upvotes: 3