gpt4 book ai didi

java - 从数据库中检索单个 ROW

转载 作者:行者123 更新时间:2023-12-02 11:45:31 26 4
gpt4 key购买 nike

我有一个 listview,当用户单击 listview 中的某个项目时,它会调用一个函数 getRow,该函数获取 id单击的项目的名称并检索单击的项目的名称。

但是,当我单击该项目时,我能够检索 ID,但它不想运行查询来检索其余信息。

这是我的代码和 logcat:

UserDbHelper.java(类)

public class UserDbHelper extends SQLiteOpenHelper {

SQLiteDatabase db;
UserDbHelper userDb;
private static final String DATABASE_NAME = "USERINFO.db";
private static final int DATABASE_VERSION = 1;
private static final String CREATE_QUERY =

"CREATE TABLE "+ UserContract.NewUserInfo.TABLE_NAME+"("+ UserContract.NewUserInfo.USER_ROWID+" integer primary key autoincrement, "+ UserContract.NewUserInfo.USER_NAME+" TEXT,"+
UserContract.NewUserInfo.USER_MOBILE+" TEXT,"+ UserContract.NewUserInfo.USER_EMAIL+" TEXT);";

public static final String[] ALL_KEYS = new String[] {UserContract.NewUserInfo.USER_ROWID, UserContract.NewUserInfo.USER_NAME, UserContract.NewUserInfo.USER_MOBILE, UserContract.NewUserInfo.USER_EMAIL};

public UserDbHelper(Context context){
super(context,DATABASE_NAME,null,DATABASE_VERSION);
Log.d("DATABASE OPERATIONS", "DATABASE CREATED/ OPENED...");

}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_QUERY);
Log.d("DATABASE OPERATIONS", "TABLE CREATED...");


}

public void addInformations(String name, String mob, String email, SQLiteDatabase sqLiteDatabase){
ContentValues contentValues = new ContentValues();
contentValues.put(UserContract.NewUserInfo.USER_NAME,name);
contentValues.put(UserContract.NewUserInfo.USER_MOBILE,mob);
contentValues.put(UserContract.NewUserInfo.USER_EMAIL,email);

sqLiteDatabase.insert(UserContract.NewUserInfo.TABLE_NAME,null,contentValues);
Log.d("DATABASE OPERATIONS", "ONE ROW INSERTED....");
}

public Cursor getInformations(SQLiteDatabase sqLiteDatabase){
Cursor cursor;

String[] projections = {UserContract.NewUserInfo.USER_NAME, UserContract.NewUserInfo.USER_MOBILE, UserContract.NewUserInfo.USER_EMAIL};
cursor = sqLiteDatabase.query(UserContract.NewUserInfo.TABLE_NAME, projections,null,null,null,null,null);

return cursor;
}

// Get a specific row (by rowId)
public Cursor getRow(long rowId) {
String where = UserContract.NewUserInfo.USER_ROWID +"="+ rowId;
Log.e("ID= ",where);

String select = "SELECT "+ UserContract.NewUserInfo.USER_NAME+" FROM "+ UserContract.NewUserInfo.TABLE_NAME+ " WHERE "+where;
Log.e("query = ", select);
db.execSQL(select);

return null;
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

}
}

ListView.java(处理点击事件的 Activity )

    public class ListActivity extends AppCompatActivity {

ListView listView;
SQLiteDatabase sqLiteDatabase;;
UserDbHelper user;
Cursor cursor;
ListDataAdapter listDataAdapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list);

listView = (ListView) findViewById(R.id.list_view);
listDataAdapter = new ListDataAdapter(getApplicationContext(),R.layout.row_layout);
listView.setAdapter(listDataAdapter);

user = new UserDbHelper(getApplicationContext());
sqLiteDatabase = user.getReadableDatabase();

cursor = user.getInformations(sqLiteDatabase);

if(cursor.moveToFirst()){
do{
String name, mob, email;
name = cursor.getString(0);
mob = cursor.getString(1);
email = cursor.getString(2);

DataProvider dataProvider = new DataProvider(name,mob,email);

listDataAdapter.add(dataProvider);
}while(cursor.moveToNext());
}

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long ldatabase) {
Cursor cursor = user.getRow(i);
if(cursor.moveToFirst()){
long idDb = cursor.getLong(0);
String message = "ID is: " +idDb;
Toast.makeText(ListActivity.this, message, Toast.LENGTH_SHORT).show();
}
}
});
}
}

OnItemClickListener 获取被单击项目的 id,将该值传递给 UserDbHelper 类以及函数 getRow,其中函数获取 id 并运行查询,但是当它想要运行查询时,它会使我的应用程序崩溃。

我还在 logcat 中打印了 ID,以检查我是否获得了 ID,确实如此。

这是 LOGCAT:

01-12 17:40:47.574 13309-13309/bluwyreinc.rohansfitness E/ID=: _id=6
01-12 17:40:47.574 13309-13309/bluwyreinc.rohansfitness E/query =: SELECT user_name FROM user_info WHERE _id=6
01-12 17:40:47.575 13309-13309/bluwyreinc.rohansfitness E/AndroidRuntime: FATAL EXCEPTION: main
Process: bluwyreinc.rohansfitness, PID: 13309
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.database.sqlite.SQLiteDatabase.execSQL(java.lang.String)' on a null object reference
at bluwyreinc.rohansfitness.UserDbHelper.getRow(UserDbHelper.java:68)
at bluwyreinc.rohansfitness.ListActivity$1.onItemClick(ListActivity.java:54)
at android.widget.AdapterView.performItemClick(AdapterView.java:343)
at android.widget.AbsListView.performItemClick(AbsListView.java:1665)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:4075)
at android.widget.AbsListView$10.run(AbsListView.java:6552)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6823)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451)
01-12 17:40:48.090 3104-3160/? E/ActivityTrigger: activityResumeTrigger: not whiteListedbluwyreinc.rohansfitness/bluwyreinc.rohansfitness.MainActivity/1

最佳答案

问题出在你的这个方法上:

public Cursor getRow(long rowId) {
String where = UserContract.NewUserInfo.USER_ROWID +"="+ rowId;
Log.e("ID= ",where);

String select = "SELECT "+ UserContract.NewUserInfo.USER_NAME+" FROM "+ UserContract.NewUserInfo.TABLE_NAME+ " WHERE "+where;
Log.e("query = ", select);

// Here db is null.
db.execSQL(select);

return null;
}

传递它sqLiteDatabase并且它应该返回光标,如下所示:

public Cursor getRow(SQLiteDatabase sqLiteDatabase, long rowId) {
String where = UserContract.NewUserInfo.USER_ROWID +"="+ rowId;
Log.e("ID= ",where);

String select = "SELECT "+ UserContract.NewUserInfo.USER_NAME+" FROM "+ UserContract.NewUserInfo.TABLE_NAME+ " WHERE "+where;
Log.e("query = ", select);
cursor = sqLiteDatabase.query(select);

return cursor;
}

关于java - 从数据库中检索单个 ROW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48235142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com