【问题标题】:Difference between OpenOrCreateDatabse and to use the database helper class?OpenOrCreateDatabse 和使用数据库助手类的区别?
【发布时间】:2016-09-06 12:10:58
【问题描述】:

我在看 derek banas 的教程,他使用 OpenOrCreate 创建数据库,这里是 java 的代码:

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

        SQLiteDatabase 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();
}

}

但是当我运行这段代码时,它向我显示了一个 toast 消息,数据库丢失,我也会向您显示 xml:

我的 XML...

<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" />

我的问题还在于我检查了网站上的教程点,他们没有使用此代码中的任何内容。相反,他们使用数据库助手类,他们使用 Insert 方法并创建 .... 并且他们在其他类中使用它们。

那么 derek banas 教程和教程点网站有什么区别,为什么当我按下创建数据库按钮时,derek banas 的代码给我这个错误“Database is missing”???

【问题讨论】:

标签: android sqlite android-studio


【解决方案1】:

SQLiteOpenHelper 版本数据库文件,以便您可以跨架构更改迁移它们。它还会为您打开数据库文件。

openOrCreateDatabase() 只是打开/创建数据库文件,SQLiteOpenHelper 在内部使用它。

为什么你得到“数据库丢失”是因为你创建/打开名为 MyContacts 的数据库文件但测试另一个文件 MyContacts.db 的存在。

【讨论】:

  • 感谢它的工作原理。但是现在我的新错误是插入语句,它会在按下添加联系人按钮时停止应用程序
【解决方案2】:

一切看起来都很好,但是您在数据库中创建表的查询是错误的,并且当您对其执行每个操作时,都会显示错误

contactsDB.execSQL("CREATE TABLE IF NOT EXISTS contacts " +
                "(id integer primary key, name VARCHAR, email VARCHAR);");

而不是使用那个使用这个

contactsDB.execSQL("CREATE TABLE IF NOT EXISTS contacts " +
                "(_id INTEGER primary key, name VARCHAR, email VARCHAR);");

因为您传递 id 的方式是错误的。根据标准,它应该是_id,也应该使用整数作为INTEGER

祝你好运

【讨论】:

  • _id 是标准,但不是必需的。而且我不认为这个案例对列类型很重要,所以我不确定你是否回答了这个问题
  • @cricket_007 感谢您的指导。我已经根据我的 android 编码经验和我使用它的方式回答了这个问题。但也要记住这一点,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多