java - Android SQLite数据库主键查询

标签 java android sql database sqlite

我已经在我的 Android 应用程序中成功创建了一个数据库。它有一个称为注册号的主键,用户在注册我的应用程序时输入该主键。一切正常,但如果两个用户输入相同的注册号,则不会创建帐户并抛出异常:

android.database.sqlite.SQLiteConstraintException: column registration_number 
is not unique (code 19)

这很好。我希望应用程序的行为像这样。但如何通知用户该注册号不可用呢? 我的代码:

public class DatabaseOperations extends SQLiteOpenHelper {

public static final int database_version=1;
public static final String DATABASE_NAME = "Aliah.db";
public static final String TABLE_NAME = "student_info";
public static final String REGISTRATION_NUMBER = "registration_number";
public static final String USER_NAME = "user_name";
public static final String USER_PASS = "user_pass";
public static final String EMAIL = "email";


public DatabaseOperations(Context context) {
    super(context, DATABASE_NAME, null, database_version);
    Log.d("Databse operations", "Database created");
}

@Override
public void onCreate(SQLiteDatabase sdb) {

    try{
    sdb.execSQL("create table "+ TABLE_NAME +" (registration_number VARCHAR PRIMARY KEY, user_name VARCHAR, user_pass VARCHAR,  email VARCHAR);");
    Log.d("Databse operations", "one row inserted");}catch(SQLException e){};
    }
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);
    onCreate(db);

}

public void putInformation(DatabaseOperations dop,String registration_number,String name,String pass,String email){

    SQLiteDatabase SQ = dop.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(REGISTRATION_NUMBER,registration_number);
    cv.put(USER_NAME, name);
    cv.put(USER_PASS,pass);
    cv.put(EMAIL,email);
    long k = SQ.insert(TABLE_NAME,null,cv);
    Log.d("Databse operations", "One row inserted");

}

public Cursor getInformation(DatabaseOperations dop){

    SQLiteDatabase SQ = dop.getReadableDatabase();
    String[] columns = {REGISTRATION_NUMBER, USER_NAME, USER_PASS, EMAIL};
    Cursor CR = SQ.query(TABLE_NAME,columns,null,null,null,null,null);
    return CR;

}

}

最佳答案

使用insertOrThrow而不是insert。这样,您可以捕获它可能抛出的 SQLException 并执行您想要的操作(在本例中,通知用户)。

引用:https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insertOrThrow(java.lang.String,%20java.lang.String,%20android.content.ContentValues)

关于java - Android SQLite数据库主键查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44035001/

相关文章:

java - 当按下后退按钮时,为Android Fragment调用Java中的AlertDialog.Builder

android - 在 Android 中使用不可编辑的电子邮件地址启动电子邮件应用程序

sql - 将每一行的数据从一个字段复制到另一个字段

sql - CTE 遍历备份层次结构?

php - 更新数据库中的所有表

java - 如何从另一个类通知RecyclerView的DataSetChanged?

java - 是否可以在 JFileChooser 窗口中选择文件名?

java - JPA:执行间接插入时锁定

java - 多次调用 java SaxParser.parse(String, Handler) 合法吗?

android - eclipse如何知道你的项目名称?