Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
请求获取错误索引0,如果要选择,则在android Sqlite中的大小为0_Android_Sqlite_Select_Insert Update_Cardview - Fatal编程技术网

请求获取错误索引0,如果要选择,则在android Sqlite中的大小为0

请求获取错误索引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

我有一个使用SQLite数据库的android应用程序。我有一个CardView,有诸如姓名、成本和描述之类的数据。My 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;
我在数据库中使用了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;
}