我正在观看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教程和Tutorials指向网站之间的区别以及为什么derek banas的代码给了我这个错误&#34;数据库缺失&#34; 当我按下在创建数据库按钮???
答案 0 :(得分:0)
SQLiteOpenHelper
版本的数据库文件,因此您可以跨架构更改迁移它们。它还会为您打开数据库文件。
openOrCreateDatabase()
只是打开/创建数据库文件,SQLiteOpenHelper
在内部使用它。
为什么你得到&#34;数据库丢失&#34;是因为您创建/打开名为MyContacts
的数据库文件,但测试是否存在另一个文件MyContacts.db
。
答案 1 :(得分:-1)
一切看起来都不错,但是你在数据库中创建表的查询是错误的,当你在它上面执行每个操作时,都显示错误
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