尝试创建数据库时获取数据库丢失

问题描述:

我使用SQLite数据库创建了我的简单项目。根据我的代码,应用程序应该显示创建数据库时,我点击'创建数据库',但它显示数据库丢失。我已经检查了logcat,但是在那里我没有发现任何错误。尝试创建数据库时获取数据库丢失

MainActivity

package com.maka.sujan.sqllitedatabase; 

import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

import java.io.File; 

public class MainActivity extends ActionBarActivity { 

    SQLiteDatabase contactsDB = null; 

    Button createDBButton, addContactButton, deleteContactButton, getContactsButton, 
      deleteDBButton; 
    EditText nameEditText, emailEditText, contactListEditText, idEditText; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     createDBButton = (Button) findViewById(R.id.createDBButton); 
     addContactButton = (Button) findViewById(R.id.addContactButton); 
     deleteContactButton = (Button) findViewById(R.id.deleteContactButton); 
     getContactsButton = (Button) findViewById(R.id.getContactsButton); 
     deleteDBButton = (Button) findViewById(R.id.deleteDBButton); 
     nameEditText = (EditText) findViewById(R.id.nameEditText); 
     emailEditText = (EditText) findViewById(R.id.emailEditText); 
     contactListEditText = (EditText) findViewById(R.id.contactListEditText); 
     idEditText = (EditText) findViewById(R.id.idEditText); 

    } 

    public void createDatabase(View view) { 

     try{ 

      // Opens a current database or creates it 
      // Pass the database name, designate that only this app can use it 
      // and a DatabaseErrorHandler in the case of database corruption 
      contactsDB = this.openOrCreateDatabase("MyContacts", MODE_PRIVATE, null); 

      // Execute an SQL statement that isn't select 
      contactsDB.execSQL("CREATE TABLE IF NOT EXISTS contacts " + 
        "(id integer primary key, name VARCHAR, email VARCHAR);"); 

      // The database on the file system 

      File database = getApplicationContext().getDatabasePath("MyContacts.db"); 

      // Check if the database exists 
      if (database.exists()) { 
       Toast.makeText(this, "Database Created", Toast.LENGTH_SHORT).show(); 
      } else { 
       Toast.makeText(this, "Database Missing", Toast.LENGTH_SHORT).show(); 
      } 

     } 

     catch(Exception e){ 

      Log.e("CONTACTS ERROR", "Error Creating Database"); 

     } 

     // Make buttons clickable since the database was created 
     addContactButton.setClickable(true); 
     deleteContactButton.setClickable(true); 
     getContactsButton.setClickable(true); 
     deleteDBButton.setClickable(true); 

    } 

    public void addContact(View view) { 

     // Get the contact name and email entered 
     String contactName = nameEditText.getText().toString(); 
     String contactEmail = emailEditText.getText().toString(); 

     // Execute SQL statement to insert new data 
     contactsDB.execSQL("INSERT INTO contacts (name, email) VALUES ('" + 
       contactName + "', '" + contactEmail + "');"); 

    } 

    public void getContacts(View view) { 

     // A Cursor provides read and write access to database results 
     Cursor cursor = contactsDB.rawQuery("SELECT * FROM contacts", null); 

     // Get the index for the column name provided 
     int idColumn = cursor.getColumnIndex("id"); 
     int nameColumn = cursor.getColumnIndex("name"); 
     int emailColumn = cursor.getColumnIndex("email"); 

     // Move to the first row of results 
     cursor.moveToFirst(); 

     String contactList = ""; 

     // Verify that we have results 
     if(cursor != null && (cursor.getCount() > 0)){ 

      do{ 
       // Get the results and store them in a String 
       String id = cursor.getString(idColumn); 
       String name = cursor.getString(nameColumn); 
       String email = cursor.getString(emailColumn); 

       contactList = contactList + id + " : " + name + " : " + email + "\n"; 

       // Keep getting results as long as they exist 
      }while(cursor.moveToNext()); 

      contactListEditText.setText(contactList); 

     } else { 

      Toast.makeText(this, "No Results to Show", Toast.LENGTH_SHORT).show(); 
      contactListEditText.setText(""); 

     } 

    } 

    public void deleteContact(View view) { 

     // Get the id to delete 
     String id = idEditText.getText().toString(); 

     // Delete matching id in database 
     contactsDB.execSQL("DELETE FROM contacts WHERE id = " + id + ";"); 

    } 

    public void deleteDatabase(View view) { 

     // Delete database 
     this.deleteDatabase("MyContacts"); 

    } 

    @Override 
    protected void onDestroy() { 

     contactsDB.close(); 

     super.onDestroy(); 
    } 

} 

activity_main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context=".MainActivity"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Create Database" 
     android:id="@+id/createDBButton" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:onClick="createDatabase"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Add Contact" 
     android:id="@+id/addContactButton" 
     android:layout_alignParentTop="true" 
     android:layout_toRightOf="@+id/createDBButton" 
     android:layout_toEndOf="@+id/createDBButton" 
     android:layout_marginLeft="10dp" 
     android:onClick="addContact" 
     android:clickable="false" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Delete Contact" 
     android:id="@+id/deleteContactButton" 
     android:layout_below="@+id/createDBButton" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:onClick="deleteContact" 
     android:clickable="false"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Get Contacts" 
     android:id="@+id/getContactsButton" 
     android:layout_below="@+id/createDBButton" 
     android:layout_toRightOf="@+id/deleteContactButton" 
     android:layout_toEndOf="@+id/deleteContactButton" 
     android:layout_marginLeft="10dp" 
     android:onClick="getContacts" 
     android:clickable="false"/> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/nameEditText" 
     android:layout_below="@+id/deleteContactButton" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:hint="Name" 
     android:layout_marginTop="5dp"/> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/emailEditText" 
     android:layout_below="@+id/nameEditText" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:hint="Email" 
     android:layout_marginTop="5dp" 
     android:inputType="textEmailAddress"/> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:inputType="number" 
     android:ems="10" 
     android:id="@+id/idEditText" 
     android:layout_below="@+id/emailEditText" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:hint="ID to Delete" 
     android:layout_marginTop="5dp"/> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Delete Database" 
     android:id="@+id/deleteDBButton" 
     android:onClick="deleteDatabase" 
     android:layout_below="@+id/idEditText" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:clickable="false" /> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:inputType="textMultiLine" 
     android:ems="10" 
     android:id="@+id/contactListEditText" 
     android:lines="8" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

</RelativeLayout> 

放线延伸:

contactsDB = this.openOrCreateDatabase("MyContacts", MODE_PRIVATE, null); 

contactsDB = this.openOrCreateDatabase("MyContacts.db", MODE_PRIVATE, null); 
+1

我试过这个,这真的有用:) –

您对openOrCreateDatabase()调用创建的文件名MyContacts数据库。

您致电getDatabasePath()会搜索具有不同名称的文件,即MyContacts.db

+0

是什么意思?你能否详细说明一下? –

+0

@Suzan Mak一切都很清楚。 –