请求获取错误索引0,如果要选择,则在android Sqlite中的大小为0
我有一个使用SQLite数据库的android应用程序。我有一个CardView,有诸如姓名、成本和描述之类的数据。My CardView有一个选项菜单,用于输入数据和更新数据。单击选项菜单时,它将转到另一个活动。在该活动中,它有一个TextView,它将在CardView中显示相同的名称 这是我的数据库代码请求获取错误索引0,如果要选择,则在android Sqlite中的大小为0,android,sqlite,select,insert-update,cardview,Android,Sqlite,Select,Insert Update,Cardview,我有一个使用SQLite数据库的android应用程序。我有一个CardView,有诸如姓名、成本和描述之类的数据。My CardView有一个选项菜单,用于输入数据和更新数据。单击选项菜单时,它将转到另一个活动。在该活动中,它有一个TextView,它将在CardView中显示相同的名称 这是我的数据库代码 public ModelPemesanan getnamap(int selectionn){ SQLiteDatabase db = this.getReadableDatab
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;
我在数据库中使用了select查询。这是我的日志
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是无用的,因为从rawQuery
方法返回的游标即使为空,也不会为null(如果没有行,其计数将为0)
您可以使用游标getCount()
方法检查行数,查看是否有0行。但是,光标移动到????方法,例如moveToFirst
方法,如果可以以其他方式执行移动,则返回true。在使用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;
}
您的根本问题可能是传递给方法的值,即selectionn不是现有id,因此您没有提取行。因此,您可能需要确定此值不匹配任何行的原因。您的查询没有返回任何数据。另外,不要像这样组装SQL语句(SQL注入的危险)。@Henry使用Androids SQLite进行SQL注入会有什么结果?数据库是本地的,用户可以随意获取数据库并修改它。@HB即使在这种情况下没有造成太大的损坏,这也是一种坏习惯。想象一下在其他情况下使用的类似代码。@Henry我想不出任何情况(使用SQLite)会造成任何损害。我的意思是,如果您使用SQLite来实现它的目的(存储用户数据),SQL注入根本不会打扰我。谢谢您的回答。单击选项菜单时没有错误。但在我的文本视图中,存储值的文本视图不显示值。“我现在必须做什么?”Anitata如最后一段所述。您可能没有传递与表中的id匹配的值。如果无法确定值与行不匹配的原因,则应在回答此问题时将此问题勾选为已回答,然后再问另一个问题。提示在这一行设置断点
db=newdatabase(this)代码>在调试模式下运行并检查pillih的值。如果这不是预期的,那么可能会在final int selectionn=listpemesanan.get(position.get_idp()之后立即出现一个断点
同时检查selectionn的值可能会显示问题所在。在我之前的帖子中,我尝试传递一个值,该值是cardview的位置。然后我输入变量“pilih”。我使用intent编写代码是错误的吗?@AnitaTata我猜您没有从菜单onClick中获得正确的值(请参阅我之前评论中提示的第二部分)。@AnitaTata使用intent extra在活动之间传递id等数据没有错。该位置的项目是否具有正确的id?
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;
}