我已经在一个Android应用程序中设置了一个SQLite数据库,但为了专注于immeify问题,我只会引用Users
表.在DatabaseContract
中,Users
表被定义为:
public final class DatabaseContract {
private DatabaseContract() {}
public static class Users implements BaseColumns {
public static final String TABLE_NAME = "users";
public static final String COLUMN_USER_ID = "_id";
public static final String COLUMN_USER_NAME = "user_name";
public static final String COLUMN_PASSWORD = "password";
public static final String COLUMN_EMAIL = "email";
public static final String COLUMN_DISPLAY_NAME = "display_name";
}
...rest of tables in db
}
在DatabaseHelper
级,这是Users
张表:
private static final String SQL_CREATE_USERS_TABLE =
"CREATE TABLE " + DatabaseContract.Users.TABLE_NAME + " (" +
DatabaseContract.Users.COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
DatabaseContract.Users.COLUMN_USER_NAME + " TEXT NOT NULL, " +
DatabaseContract.Users.COLUMN_PASSWORD + " TEXT NOT NULL, " +
DatabaseContract.Users.COLUMN_EMAIL + " TEXT, " +
DatabaseContract.Users.COLUMN_DISPLAY_NAME + " TEXT)";
在我的AddUserActivity
类中,运行这个方法addUserToDatabase(String name, String email, String password, String displayName)
,它似乎可以工作,但是我希望从Users
表中获得自动生成的‘id’,然后在这里检索‘id’:
// Check if the insertion was successful
if (newRowId != -1) {
// User was added successfully
Toast.makeText(this, "User added successfully!", Toast.LENGTH_SHORT).show();
// Get the user_id of the newly added user
int user_id = getUserId(db, name);
...
下面是方法getUserId(db, name)
:
private int getUserId(SQLiteDatabase db, String name) {
int user_id = -1; // Default value if no user is found
// Define the columns you want to retrieve
String[] projection = {
DatabaseContract.Users.COLUMN_USER_ID
};
// Define the selection based on the user name
String selection = DatabaseContract.Users.COLUMN_USER_NAME + " = ?";
String[] selectionArgs = { name };
// Define the sort order (if needed)
String sortOrder = null;
Cursor cursor = db.query(
DatabaseContract.Users.TABLE_NAME,
projection,
selection,
selectionArgs,
null,
null,
sortOrder
);
if (cursor.moveToFirst()) {
// Get the user_id from the cursor
int usersIdIndex = cursor.getColumnIndexOrThrow(DatabaseContract.Users.COLUMN_USER_ID);
user_id = cursor.getInt(usersIdIndex);
}
// Close the cursor (don't close the database here)
cursor.close();
return user_id;
}
然后,我创建了一个意图,将此数据传递给WelcomeActivity
页:
...
// Create an Intent to navigate to WelcomeActivity
Intent intent = new Intent(AddUserActivity.this, WelcomeActivity.class);
int testNumber = 777;
// Pass user data and user_id as extras in the Intent
intent.putExtra("USER_ID", user_id);//testNumber
intent.putExtra("USER_NAME", name);
intent.putExtra("USER_EMAIL", email);
intent.putExtra("USER_DISPLAY_NAME", displayName);
// Start the WelcomeActivity
startActivity(intent);
// Close this activity
finish();
此时,程序崩溃,并显示以下错误:
E/SQLiteLog: (1) no such column: _id in "SELECT _id FROM users WHERE user_name = ?"
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.enetapplications.songtracker, PID: 5937
android.database.sqlite.SQLiteException: no such column: _id (code 1 SQLITE_ERROR[1]): , while compiling: SELECT _id FROM users WHERE user_name = ?
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1478)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:916)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:63)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:2088)
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1935)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1806)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1974)
at com.enetapplications.songtracker.AddUserActivity.getUserId(AddUserActivity.java:124)
at com.enetapplications.songtracker.AddUserActivity.addUserToDatabase(AddUserActivity.java:84)
at com.enetapplications.songtracker.AddUserActivity.access$400(AddUserActivity.java:20)
at com.enetapplications.songtracker.AddUserActivity$1.onClick(AddUserActivity.java:58)
at android.view.View.performClick(View.java:7792)
at android.widget.TextView.performClick(TextView.java:16112)
at android.view.View.performClickInternal(View.java:7769)
at android.view.View.access$3800(View.java:910)
at android.view.View$PerformClick.run(View.java:30218)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8663)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:567)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)
我是SQLite的新手,因此习惯了SQLite-但非常熟悉标准的SQL/MySQL.我倾向于将Users
表的键命名为user_id
,而SQLite标准似乎将表的键保持为_id
提前感谢您的 comments 和 comments !
最好的, 布赖恩