android - 获取错误索引 0 请求,当想要选择时,android Sqlite 中的大小为 0
问题描述
我有一个使用 SQLite 数据库的 android 应用程序。我有一个 CardView 并且有名称、成本和描述等数据。我的 CardView 有一个选项菜单来输入数据并更新它。单击选项菜单时,它将转到另一个活动。在该活动中,它有一个 TextView,它将在 CardView 中显示相同的名称。
这是我的数据库代码
public ModelPemesanan getnamap(int selectionn){
SQLiteDatabase db = this.getReadableDatabase();
String cb = "SELECT * FROM " + TABLE_PEMESANAN + " WHERE " + KEY_ID_PEMESANAN + "= '" + selectionn + "'";
Cursor cursor = db.rawQuery(cb, null);
if (cursor != null)
cursor.moveToFirst();
ModelPemesanan modelPemesanan = new ModelPemesanan();
modelPemesanan.set_namap(cursor.getString(1));
modelPemesanan.set_lapak(cursor.getString(2));
modelPemesanan.set_desk(cursor.getString(3));
modelPemesanan.set_lapak(cursor.getString(4));
modelPemesanan.set_total(Integer.parseInt(cursor.getString(6)));
modelPemesanan.set_resi(cursor.getString(7));
db.close();
return modelPemesanan;
}
在我用来输入数据的课堂上
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_resi);
init();
simpan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
modelPemesanan.set_namap(nama.getText().toString());
modelPemesanan.set_resi(nores.getText().toString());
db.updateresi(modelPemesanan);
}
});
}
private void init() {
pilih = getIntent().getIntExtra("id_pemesanan", 0);
db = new Database(this);
modelPemesanan = db.getnamap(pilih);
judul = (TextView) findViewById(R.id.tvmasukkan);
nama = (TextView) findViewById(R.id.tvnamapembeli);
nores = (EditText) findViewById(R.id.etnoresi);
simpan = (Button) findViewById(R.id.btsimpannoresi);
lapak = (TextView) findViewById(R.id.tvnamalapak);
nama.setText(modelPemesanan.get_namap());
}
在我的适配器类中,我使用意图来传递索引的值。
holder.pop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {
PopupMenu popup = new PopupMenu(context, holder.pop);
popup.inflate(R.menu.menu_list);
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
db = new Database(context);
final int selectionn = listpemesanan.get(position).get_idp();
switch (item.getItemId()){
case R.id.input:
Intent i = new Intent(v.getContext(), ResiAct.class);
i.putExtra("id_pemesanan", selectionn);
context.startActivity(i);
break;
我在我的数据库中使用了一个选择查询。这是我的日志猫
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.asus.daringku/com.example.asus.daringku.ResiAct}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2345)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2405)
at android.app.ActivityThread.access$800(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1323)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5376)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
at com.example.asus.daringku.Database.Database.getnamap(Database.java:279)
at com.example.asus.daringku.ResiAct.init(ResiAct.java:44)
at com.example.asus.daringku.ResiAct.onCreate(ResiAct.java:28)
at android.app.Activity.performCreate(Activity.java:6021)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2405)
at android.app.ActivityThread.access$800(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1323)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5376)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
这是我的 XML
<TextView
android:id="@+id/tvmasukkan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Masukkan Nomor Resi untuk : "
android:textSize="20sp"
android:padding="10dp"/>
<TextView
android:id="@+id/tvnamapembeli"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="17sp"
android:padding="10dp"
android:text="NAMA"
android:layout_below="@id/tvmasukkan"
/>
<TextView
android:id="@+id/tvnamalapak"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tvnamapembeli"
android:padding="10dp"
android:textSize="17sp"
android:text="NAMA LAPAK"
/>
<EditText
android:id="@+id/etnoresi"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Masukkan Nomor Resi"
android:padding="10dp"
android:layout_below="@id/tvnamalapak"/>
<Button
android:id="@+id/btsimpannoresi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/etnoresi"
android:layout_centerHorizontal="true"
android:padding="10dp"
android:text="simpan"/>
请帮忙!谢谢你。
解决方案
大小为 0表示没有可从中提取数据的已提取行。
当没有行时,您不应该尝试从游标中提取数据(您会遇到这样的异常),因此您应该在尝试从游标中提取数据之前检查是否有可以从中提取数据的行。
您的代码正在检查从该rawQuery
方法返回的游标,以查看它是否为null,可能是为了避免检查空游标。检查null是没有用的,因为从方法返回的 Cursor rawQuery
,即使它是空的,也不会为 null(如果没有行,它的计数将为 0)。
您可以使用 Cursor 方法检查行数,getCount()
以查看是否有 0 行。然而,光标moveTo
????如果可以进行移动,则方法(例如moveToFirst
方法)返回true ,否则返回false。当您使用该moveToFirst
方法时,您只需检查结果以查看是否进行了移动,而不是检查行数。
因此,您可以使用:-
public ModelPemesanan getnamap(int selectionn){
SQLiteDatabase db = this.getReadableDatabase();
String cb = "SELECT * FROM " + TABLE_PEMESANAN + " WHERE " + KEY_ID_PEMESANAN + "= '" + selectionn + "'";
Cursor cursor = db.rawQuery(cb, null);
ModelPemesanan modelPemesanan = new ModelPemesanan(); //<<<<<<<< MOVED HERE
if (cursor.moveToFirst() {
modelPemesanan.set_namap(cursor.getString(1));
modelPemesanan.set_lapak(cursor.getString(2));
modelPemesanan.set_desk(cursor.getString(3));
modelPemesanan.set_lapak(cursor.getString(4));
modelPemesanan.set_total(Integer.parseInt(cursor.getString(6)));
modelPemesanan.set_resi(cursor.getString(7));
}
cursor.close() //<<<<<<<< YOU SHOULD ALWAYS CLOSE CURSORS WHEN DONE WITH THEM
db.close();
return modelPemesanan;
}
- 请注意,如果没有返回行,则返回的
ModelPemesanan
将与构造时一样。因此,您可能应该检查它以确定是否已设置任何数据。
但是,更好/推荐的方法是使用参数来传递参数(防止 SQL 注入)以及 SQLiteDatabase 便利方法(构建适当的底层 SQL),当它们可以使用时。
因此,将推荐以下内容:-
public ModelPemesanan getnamap(int selectionn){
SQLiteDatabase db = this.getReadableDatabase();
String whereclause = KEY_ID_PEMESANAN + "=?";
String[] whereargs = new String[]{String.valueOf(selectionn)};
Cursor cursor = db.query(
TABLE_PEMESANAN,
null, //<<<< null = all columns, else String[] of columns to extract
whereclause, //<<<< WHERE clause less WHERE keyword with ? for arguments (as per whereargs 1 for 1)
whereargs, // <<<< arguments to replace ? placeholder on 1 for 1 basis
null, // <<<< GROUP BY clause less GROUP BY keywords (null for no clause)
null, // <<<< HAVING clause less HAVING keyword (null for no clause)
null // <<<< ORDER BY clause less ORDER BY keywords (null for no clause)
);
ModelPemesanan modelPemesanan = new ModelPemesanan(); //<<<<<<<< MOVED HERE
if (cursor.moveToFirst() {
modelPemesanan.set_namap(cursor.getString(1));
modelPemesanan.set_lapak(cursor.getString(2));
modelPemesanan.set_desk(cursor.getString(3));
modelPemesanan.set_lapak(cursor.getString(4));
modelPemesanan.set_total(Integer.parseInt(cursor.getString(6)));
modelPemesanan.set_resi(cursor.getString(7));
}
cursor.close() //<<<<<<<< YOU SHOULD ALWAYS CLOSE CURSORS WHEN DONE WITH THEM
db.close();
return modelPemesanan;
}
您的根本问题可能是传递给该方法的值,即selectionn不是现有的 id,因此您没有提取任何行。所以你可能需要确定为什么这个值不匹配任何行。
推荐阅读
- python - 如何在 Odoo 14 的 Many2one 字段中显示多个字段的数据?
- c++ - 使用 Linux pread 是否可以避免“无法读取由不同线程写入的数据”?
- machine-learning - XGBoost predict_proba 推理性能慢
- docker - Visual Studio 2019 错误 CTC1001:未启用卷共享
- reactjs - Django,Djoser 社交身份验证:在服务器端会话数据中找不到状态。状态码 400
- c - 我将如何创建一个函数来确定文件是否存在?
- python - 冻结的数值数组、数据类、numba
- python-3.x - 您是否使用此功能获得索引错误?
- sql-server - 使用 varbinary 参数更新存储过程中的语句
- python - 写很多列(超过20)