【问题标题】:Selecting in SQLite Database Android在 SQLite 数据库 Android 中选择
【发布时间】:2017-02-18 16:53:09
【问题描述】:

每当我创建一个新数据库并向其中插入数据时,我都可以选择插入的数据,但第二次插入表并尝试选择它时,它会显示第一个数据本身。

这是 onClickListener 的代码(从表中选择):

mydb = openOrCreateDatabase("Countz_DB",MODE_PRIVATE,null);

和

mnew.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            c = mydb.rawQuery("Select * from Countz",null);
            if (c.moveToFirst()){
                name = c.getString(0);
                desc = c.getString(1);
                Snackbar.make(v, "Name:"+name+" Desc:"+desc, Snackbar.LENGTH_LONG).show();
            }
        }
    });

这是我用来向表中插入值的代码:

public void InsertintoCount(){
    String sqlc = "INSERT INTO Countz VALUES('"+name+"','"+desc+"','"+x+"','"+cDT+"');";
    newdb.execSQL(sqlc);
    }

【问题讨论】:

    标签: android sql sqlite sql-insert


    【解决方案1】:

    这是因为您的光标始终会移动到点击事件的第一个位置。尝试执行以下操作::

    mnew.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            c = mydb.rawQuery("Select * from Countz",null);
            if (c.moveToLast()){
                name = c.getString(0);
                desc = c.getString(1);
                Snackbar.make(v, "Name:"+name+" Desc:"+desc, Snackbar.LENGTH_LONG).show();
            }
        }
    });
    

    如果你想遍历表中的所有行,那么 ::

    mnew.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            c = mydb.rawQuery("Select * from Countz",null);
            if(c>0) {
            c.moveToFirst();
            do {
                name = c.getString(0);
                desc = c.getString(1);
                Snackbar.make(v, "Name:"+name+" Desc:"+desc, Snackbar.LENGTH_LONG).show();
           } while(c.moveToNext());
            }
        }
    });
    

    之后您将获得所有发布的价值。

    如果您想要最近插入的值,则必须在插入操作后返回 rowId,然后使用查询“SELECT * FROM table WHERE id="+id;

    从数据库中获取行

    但处理数据库事务的更好方法是创建一个处理程序类并从您需要的任何地方访问它。

    按照本教程进行操作 :: SQLite Database Example

    【讨论】:

      【解决方案2】:

      试试这个

      if (c.moveToFirst()){
          do {
                  name = c.getString(0);
                  desc = c.getString(1);
                  Snackbar.make(v, "Name:"+name+" Desc:"+desc, Snackbar.LENGTH_LONG).show();
          } while(c.moveToNext());
      }
      

      【讨论】:

        【解决方案3】:

        那是因为您只读取了一次结果。 Cursor 有几行,你必须通过它们。

        您必须遍历 Cursor。

        尝试以下方法:

        if (c.moveToFirst()){
            do {
                    name = c.getString(0);
                    desc = c.getString(1);
                    Snackbar.make(v, "Name:"+name+" Desc:"+desc, Snackbar.LENGTH_LONG).show();
            } while (c.moveToNext());
        }
        

        告诉我们它是否有效。

        【讨论】:

        • 这将跳过第一个条目。
        • @AbhishekJain Wops,这是真的。固定。
        【解决方案4】:

        我第二次插入表格并尝试选择它时,它显示 我是第一个数据本身。

        那是因为您选择的是第一个条目本身。

        if (c.moveToFirst()){
            name = c.getString(0);
            desc = c.getString(1);
            Snackbar.make(v, "Name:"+name+" Desc:"+desc, Snackbar.LENGTH_LONG).show();
        }
        

        通知c.moveToFirst()。这将带您到光标中的第一个条目。如果您想要最后一个条目,请使用c.moveToLast()。

        或者,如果您想查看所有条目,请执行以下操作:

        if (c.moveToFirst()){
            while (!c.isAfterLast) {
                name = c.getString(0);
                desc = c.getString(1);
                Snackbar.make(v, "Name:"+name+" Desc:"+desc, Snackbar.LENGTH_LONG).show();
                c.moveToNext();
            }
        }
        

        c.isAfterLast() 告诉光标是否指向最后一行之后的位置(这是您要中断循环的位置)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-09
          • 2011-12-16
          • 2019-05-08
          • 2012-09-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多