我正在粘贴测试数据库应用程序的整个源代码。这应该可以解决您的问题。
我有一个活动类,它将为您提供用于下订单的 UI 和支持的 xml 文件,以及一个用于执行数据库操作的 DbHandler 类。
这是活动代码。
package com.test;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.database.sqlite.SQLiteConstraintException;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class TestActivity extends Activity implements OnClickListener{
private EditText accountId = null;
private EditText orderNumber = null;
private Button submit = null;
private DBHandler dbHandler = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
setupUiElementProperties();
dbHandler = new DBHandler(this);
}
private void setupUiElementProperties() {
accountId = (EditText)findViewById(R.id.accountEditText);
orderNumber = (EditText)findViewById(R.id.orderNoEditText);
submit = (Button)findViewById(R.id.submit);
submit.setOnClickListener(this);
}
public void onClick(View v) {
try {
dbHandler.placeOrder(Integer.parseInt(accountId.getText().toString().trim()),
Integer.parseInt(orderNumber.getText().toString().trim()));
showAlert("ORDER PLACED SUCCESSFULLY");
System.out.println("DONE..");
}catch (SQLiteConstraintException ex) {
System.out.println("SQLITE EXCEPTIOn: " + ex.getMessage());
showAlert("THIS ACCOUNT DOES NOT EXISTS");
}catch (Exception e) {
System.out.println("Exceptionn: " + e.getMessage());
}
}
private void showAlert(String message) {
new AlertDialog.Builder(TestActivity.this)
.setTitle("Alert")
.setMessage(message)
.setPositiveButton("ok", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dlg, int sumthin) {}
})
.show();
}
}
这是 main.xml 的 xml 代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/accountEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_margin="10dp"
android:layout_toRightOf="@+id/accountNoLabel" android:inputType="number">
<requestFocus />
</EditText>
<TextView
android:id="@+id/accountNoLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/accountEditText"
android:layout_alignBottom="@+id/accountEditText"
android:layout_alignParentLeft="true"
android:text="Account Id" android:layout_marginLeft="5dp"/>
<EditText
android:id="@+id/orderNoEditText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/accountEditText"
android:layout_alignRight="@+id/accountEditText"
android:layout_below="@+id/accountEditText" android:inputType="number"/>
<TextView
android:id="@+id/orderLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/orderNoEditText"
android:layout_alignBottom="@+id/orderNoEditText"
android:layout_alignLeft="@+id/accountNoLabel"
android:text="Order No" />
<Button
android:id="@+id/submit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Submit" />
</RelativeLayout>
最后是 DbHandler 类
package com.test;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHandler extends SQLiteOpenHelper {
private SQLiteDatabase sqliteDatabaseInstance_ = null;
public DBHandler(Context context){
super(context, "TESTDATABASE.db", null, 1);
sqliteDatabaseInstance_ = getWritableDatabase();
sqliteDatabaseInstance_.execSQL("PRAGMA foreign_keys = ON;");
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL("CREATE TABLE ACCOUNT (accountId INTEGER PRIMARY KEY, name TEXT)");
insertAccount(1234, "xyz", db);
db.execSQL("CREATE TABLE ORDER_DETAILS (orderNo INTEGER, accountId INTEGER," +
"FOREIGN KEY (accountId) REFERENCES ACCOUNT(accountId))");
}catch (SQLiteConstraintException sqliteConstraintException) {
System.out.println("sqliteConstraintException: " + sqliteConstraintException.getMessage());
}catch (Exception e) {
System.out.println("Exception in DBHandler.onCreate: "+e.getMessage());
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
public void placeOrder(int accountNo, int orderNo) throws SQLiteConstraintException{
ContentValues cv = new ContentValues();
cv.put("accountId", accountNo);
cv.put("orderNo", orderNo);
sqliteDatabaseInstance_.insertOrThrow("ORDER_DETAILS", null, cv);
}
private void insertAccount(int accId, String accountHolderName, SQLiteDatabase db) {
ContentValues cv = new ContentValues();
System.out.println("db: " + db);
System.out.println("accountId: " + accId) ;
System.out.println("accountHolderName: " + accountHolderName);
cv.put("accountId", accId);
cv.put("name", accountHolderName);
db.insertOrThrow("ACCOUNT", null, cv);
}
}
实际上,您不会手动添加订单号(ORDER_DETAILS 表)。该字段必须自动递增并输入数据库。
我在 DbHandler 中添加了 insertAccount(),因为“Account”表没有任何条目。使用这种方法,我正在添加一个帐户 ID 为“1234”的帐户。
这应该是你的输出:
方案 1 帐号:1234 订单号:453412
当帐户 ID 1234 存在于 ACCOUNT 表中时,此条目将被插入到数据库中,并显示成功更新警报。
方案 2 帐户 2343 订单号:14523
由于外键约束失败,此条目将不被接受。因此,您会收到“此帐户不存在”的警报。
我的数据库可能与您需要的不同,但我希望这足以帮助您。
使用 SQLITEBROWSER 查看数据。
你的数据库文件应该在.........
转到文件资源管理器 -----> 数据 ------> 数据 ------> com.test -----> TESTDATA.db