Android Studio Cursor里面的数据获取并且使用

在使用Android Studio,使用数据库时查询用到cursor。

但是怎么查询到之后,怎么使用里面的数据呢?

在这里以我用的Sqlite为例:

使用Cursor对象获取查询结果

  一、要执行查询,需要用到SQLiteDatabase 对象的rawQuery()方法,第1个参数为SELECT语句,第2个参数设为null即可:

rawQuery("SELECT *  FROM  test",null);  //返回test数据表的所有记录

        二、rawQuery()方法返回的查询结果为Cursor类的对象。Cursor可称为”数据指针“,要读取查询结果中某一个记录,就必须将Cursor指标指到它,之后才能读取其内容。

moveToFirst() 移到第一个记录 moveToLast() 移到最后一个记录
moveToNext() 移到下一个记录 moveToPrevious() 移到前一个记录
Cursor cur = db.rawQuery("SELECT  *   FROM  test");//执行查询
if(cur.moveToFirst())   //查询结果中有数据才继续
    do{               //利用do/while循环逐个读取
    … //读取指针所指的数据
}while(cur.moveToNext());  //若还有下一个记录,就继续do/while循环

public class MainActivity extends ActionBarActivity {
    static final String db_name = "testDB";  //数据库名称
    static final String tb_name = "test";   // 数据表名称
    SQLiteDatabase db; //数据库对象

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

        //打开或创建数据库
        db = openOrCreateDatabase(db_name, Context.MODE_PRIVATE,null);
        String createTable = "CREATE TABLE IF NOT EXISTS " +
                tb_name +
                "(name VARCHAR(32)," +
                "phone VARCHAR(16)," +
                "email VARCHAR(64))";
        db.execSQL(createTable);        //创建数据表

        Cursor c = db.rawQuery("SELECT  *  FROM "+tb_name,null);//查询tb_name数据表中的所有数据

        if(c.getCount()==0){          //若无数据,则立即新增两项数据
            addData("Flag Publishing Co.","6666666","[email protected]");
            addData("PCDIY Magazine","7777777","[email protected]");
            c=db.rawQuery("SELECT  *  FROM "+tb_name,null);//重新查询
        }

        if (c.moveToFirst()) {         //移到第1项数据(若有数据才继续)
            String str = "总共有  "+c.getCount()+"项数据\n";
            str+="-------\n";

            do {              //逐项读出数据,并串接成信息字符串
                str+="name:"+c.getString(0)+"\n";
                str+="phone:"+c.getString(1)+"\n";
                str+="email:"+c.getString(2)+"\n";
                str+="------\n";
            }while(c.moveToNext());   //有下一项就继续循环
            TextView txv = (TextView) findViewById(R.id.txv);
            txv.setText(str);   //显示信息字符串
        }
        db.close();  //关闭数据库
    }

    private void addData(String name,String phone,String email) {
        ContentValues cv = new ContentValues(3);  //创建含3个数据项的对象

        cv.put("name", name);
        cv.put("phone",phone);
        cv.put("email", email);

        db.insert(tb_name, null, cv);    //将数据加到数据表
    }

}

 那么怎么页面之间传输获取到的数据呢?

一、第一种数据传递的方式是通过inputExtra方法来进行数据的传递的

 Intent intent=new Intent(MainActivity.this,XXX.class);//xxx为你要传递数据的界面类名
               
                intent.putExtra("这里写你想要传递的数据名(可以随便写,但是别忘了待会还得用)", name);//name是你要传递的数据,按照第三步骤自己提前获取
               
                startActivity(intent);跟Intent的用法很像,只是多了上面的putextra代码

接下来就是接受数据了,到你的xxx.Java文件里

 Intent intent=getIntent();这是默认格式,直接用就可以
        String name=intent.getStringExtra("name");
//前面这个name是可以随便写,但是后面这个name必须是你刚刚写的传递数据的名字
//这两个名字可以是一样的,你怕混淆可以用一样的,

现在已经在新的类文件的中获取到了传递的数据,接下来你就用了

比如,把这个数据显示出来:

第一、在新的类文件的布局文件里写好一个textview再绑定,然后可以用

xx.setText(name);//这里用拿刚刚的name为例,根据自己的需求填写

总结:其实很简单,第一步用intent结合extra传递数据

第二、用extra getstring接受数据就可以

二、android传递数据的第二中方式第二种传递数据的方式是bundle:

Bundle传递对象示例

        当传递的参数很多时可以传递一个对象。当Bundle传递的是对象或对象数组时,必须实现Serialiable或Parcelable接口。
1. 实现Serializable接口

package com.example.bundletest;
import java.io.Serializable;
public class FunPerson implements Serializable {
    //创建实例变量
    private String name;
    private int num;
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setNum(int num) {
        this.num = num;
    }
    public int getNum() {
        return num;
    }
}

2. 向Bundle写入数据

public class MainActivity extends AppCompatActivity {
    //声明控件对象
    private Button mButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取控件的对象
        mButton = findViewById(R.id.button);
        //为Button绑定监听器
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /**
                 * 存入数据
                 */
                FunPerson person = new FunPerson();
                //设置数据
                String name = "Trump is fun";
                int num = 12345;
                person.setName("name");
                person.setNum(num);
                //实例化一个Bundle
                Bundle bundle = new Bundle();
                //把FunPerson数据放入到Bundle容器中
                bundle.putSerializable("Person", person);
                Intent intent = new Intent(MainActivity.this, SecondActivity.class);
                //把Bundle容器中的数据放到Intent中
                intent.putExtras(bundle);
                //启动该Intent,实现Activity的跳转
                startActivity(intent);
            }
        });
    }
}

3. 从Bundle读取数据

public class SecondActivity extends AppCompatActivity {
    //声明控件对象
    private TextView textView;
    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        //获取控件的对象
        textView = findViewById(R.id.text_view);
        /**
         *读取数据
         */
        Intent intent = getIntent();
        //从Intent中取出Bundle
        Bundle bundle = intent.getExtras();
        //获取FunPerson里的数据数据
        assert bundle != null;
        FunPerson person = (FunPerson)bundle.getSerializable("Person");
        assert person != null;
        String name = person.getName();
        int num = person.getNum();
        //显示数据
        textView.setText(name + "\n" + num);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_52078947/article/details/131364022