使用Room DB构建Android应用。我已经多次卸载了该应用程序,但似乎总是得到与重新安装该应用程序相同的条目。
我似乎无法到达RoomDatabase.Callback的onCreate部分,因为我试图添加一些虚拟条目并将一些信息记录到日志中。
public class MainActivity extends AppCompatActivity {
private ContactsAdapter contactsAdapter;
private ArrayList<Contact> contactArrayList = new ArrayList<>();
private RecyclerView recyclerView;
private ContactsAppDatabase contactsAppDatabase;
private static final String TAG="MainActivityTag";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setTitle(" Contacts Manager ");
recyclerView = findViewById(R.id.recycler_view_contacts);
contactsAppDatabase= Room.databaseBuilder(getApplicationContext(),ContactsAppDatabase.class,"ContactDB")
.addCallback(callback)
.build();
new GetAllContactsAsyncTask().execute();
contactsAdapter = new ContactsAdapter(this, contactArrayList, MainActivity.this);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(contactsAdapter);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addAndEditContacts(false, null, -1);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void addAndEditContacts(final boolean isUpdate, final Contact contact, final int position) {
LayoutInflater layoutInflaterAndroid = LayoutInflater.from(getApplicationContext());
View view = layoutInflaterAndroid.inflate(R.layout.layout_add_contact, null);
AlertDialog.Builder alertDialogBuilderUserInput = new AlertDialog.Builder(MainActivity.this);
alertDialogBuilderUserInput.setView(view);
TextView contactTitle = view.findViewById(R.id.new_contact_title);
final EditText newContact = view.findViewById(R.id.name);
final EditText contactEmail = view.findViewById(R.id.email);
contactTitle.setText(!isUpdate ? "Add New Contact" : "Edit Contact");
if (isUpdate && contact != null) {
newContact.setText(contact.getName());
contactEmail.setText(contact.getEmail());
}
alertDialogBuilderUserInput
.setCancelable(false)
.setPositiveButton(isUpdate ? "Update" : "Save", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogBox, int id) {
}
})
.setNegativeButton("Delete",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialogBox, int id) {
if (isUpdate) {
deleteContact(contact, position);
} else {
dialogBox.cancel();
}
}
});
final AlertDialog alertDialog = alertDialogBuilderUserInput.create();
alertDialog.show();
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (TextUtils.isEmpty(newContact.getText().toString())) {
Toast.makeText(MainActivity.this, "Enter contact name!", Toast.LENGTH_SHORT).show();
return;
} else {
alertDialog.dismiss();
}
if (isUpdate && contact != null) {
updateContact(newContact.getText().toString(), contactEmail.getText().toString(), position);
} else {
createContact(newContact.getText().toString(), contactEmail.getText().toString());
}
}
});
}
private void deleteContact(Contact contact, int position) {
contactArrayList.remove(position);
new DeleteContactAsyncTask().execute(contact);
}
private void updateContact(String name, String email, int position) {
Contact contact = contactArrayList.get(position);
contact.setName(name);
contact.setEmail(email);
new UpdateContactAsyncTask().execute(contact);
contactArrayList.set(position, contact);
}
private void createContact(String name, String email) {
new CreateContactAsyncTask().execute(new Contact(0,name,email));
}
private class GetAllContactsAsyncTask extends AsyncTask<Void,Void,Void>{
@Override
protected Void doInBackground(Void... voids) {
contactArrayList.addAll(contactsAppDatabase.getContactDAO().getContacts());
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
contactsAdapter.notifyDataSetChanged();
}
}
private class CreateContactAsyncTask extends AsyncTask<Contact,Void,Void>{
@Override
protected Void doInBackground(Contact... contacts) {
long id = contactsAppDatabase.getContactDAO().addContact(contacts[0]);
Contact contact = contactsAppDatabase.getContactDAO().getContact(id);
if (contact != null) {
contactArrayList.add(0, contact);
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
contactsAdapter.notifyDataSetChanged();
}
}
private class UpdateContactAsyncTask extends AsyncTask<Contact,Void,Void>{
@Override
protected Void doInBackground(Contact... contacts) {
contactsAppDatabase.getContactDAO().updateContact(contacts[0]);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
contactsAdapter.notifyDataSetChanged();
}
}
private class DeleteContactAsyncTask extends AsyncTask<Contact,Void,Void>{
@Override
protected Void doInBackground(Contact... contacts) {
contactsAppDatabase.getContactDAO().deleteContact(contacts[0]);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
contactsAdapter.notifyDataSetChanged();
}
}
RoomDatabase.Callback callback = new RoomDatabase.Callback() {
@Override
public void onCreate(@NonNull SupportSQLiteDatabase db) {
super.onCreate(db);
//Toast.makeText(getApplicationContext()," On Create Called ",Toast.LENGTH_LONG).show();
Log.i(TAG, " on create invoked ");
createContact("name 1","email 1");
createContact("name 2","email 2");
createContact("name 3","email 3");
}
@Override
public void onOpen(@NonNull SupportSQLiteDatabase db) {
super.onOpen(db);
// Toast.makeText(getApplicationContext()," On Create Called ",Toast.LENGTH_LONG).show();
Log.i(TAG, " on open invoked ");
}
};
}
我已在清单中添加了写入/读取外部存储,不确定那是否重要。
事情是onOpen在回调函数中被调用,所以看起来有点奇怪。
当我在其他设备上安装该应用程序时,它可以正常工作。显然,在另一台(第一台)设备上,即使删除并重新安装了该应用程序,我仍然会收到错误消息。
请帮助。