美文网首页
Android中Sqlite数据库读写数据

Android中Sqlite数据库读写数据

作者: baolvlv | 来源:发表于2017-09-01 14:46 被阅读0次

            Sqlite数据库作为一个轻量级数据库,可以较为方便地实现Android中诸如历史记录的储存等操作。本文首先介绍Sqlite数据库的创建与读写等数据库操作,而后完成使用界面的方式操作Sqlite数据库中的数据。

    详细代码:github.com/Baolvlv/LearnAndroid/tree/master/UsingSqlite

    一、Sqlite数据库的数据读取与写入

    SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎。它是一个零配置的数据库,不需要在系统中配置。SQLite引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite直接访问其存储文件。

    1.创建

    创建类继承自SQLiteOpenHelper

    public classDbextendsSQLiteOpenHelper {

    添加构造函数,不需要的参数可以不写

    //构造函数,参数:name为数据库名称,Cursor用于逐行读取数据库结果,封装的查询结果,version为版本号

    publicDb(Context context) {

    super(context,"db", null,1);

    }

    重写数据库创建与升级方法

    //当应用中不存在数据库时创建

    @Override

    public voidonCreate(SQLiteDatabase db) {

    //创建表,包含name,sex两列,文本类型,默认值为空  PRIMARY KEY AUTOINCREMENT主键自增

    db.execSQL("CREATE TABLE user("+

    "_id INTEGER PRIMARY KEY AUTOINCREMENT,"+

    "name TEXT,"+

    "sex TEXT)");

    }

    //数据库升级,sql语句操作数据库,检查操作系统中的同名数据库版本号低则升级

    @Override

    public voidonUpgrade(SQLiteDatabase db, intoldVersion, intnewVersion) {

    }

    2.写入数据

    //实例化数据库对象

    Db db =newDb(this);

    //获取可写入数据库用于插入数据

    SQLiteDatabase dbWrite = db.getWritableDatabase();

    //使用ContentValues封装数据

    ContentValues cv =newContentValues();

    //输入对应的键值对的值

    cv.put("name","bss");

    cv.put("sex","男");

    //插入数据,参数为表名,当列为空时的填充值,封装数据的ContentValue

    dbWrite.insert("user",null,cv);

    使用完成后关闭数据库

    //使用完之后关闭数据库

    dbWrite.close();

    3.读取数据

    获取可读取数据库

    SQLiteDatabasedbRead = db.getReadableDatabase();

    使用query()方法查询,返回值为Cursor

    Cursor c = dbRead.query("user",null,null,null,null,null,null);

    query()的参数为:

    参数:表名,查询的列,查询条件,条件参数,分组,分组条件,顺序

    查询列的写法:

    new String[]{"name"}

    为防止sql注入攻击,查询条件与条件参数为:

    "name =?",new String[]{"bss"

    通过Cursor的moveToNext方法判断结果是否结束,通过getColumnIndex获取查询列的编号

    通过getString获取编号下的值

    while(c.moveToNext()){

    String name = c.getString(c.getColumnIndex("name"));

    String sex = c.getString(c.getColumnIndex("sex”));

    二、通过界面操作Sqlite数据库

    将数据库查询结果呈现到ListView中

    主布局中添加listView,声明SimpleCursorAdapter对象用于接收查询结果Cursor

    privateSimpleCursorAdapteradapter;

    实例化数据库对象,获取可读写数据库对象

    db=newDb(this);

    dbRead=db.getReadableDatabase();

    dbWrite=db.getWritableDatabase();

    实例化SimpleCursorAdapter对象,参数为

    //参数:context,显示结果的布局资源,Cursor,Cursor的需要输出的数据源,输出的位置,初次查询时cursor可以为空

    adapter=newSimpleCursorAdapter(this,R.layout.user_list_cell

    ,null,newString[]{"name","sex"},new int[]{R.id.tvName,R.id.tvSex});

    用于呈现结果的布局需要手动创建,线形布局,分别用大小文本呈现

    大小文本的样式分别为:

    android:textAppearance="?android:textAppearanceLarge”/>

    android:textAppearance="?android:textAppearanceMedium"/>

    注意:SimpleCursorAdapter要求数据表中必须有_id这一列,且为自增主键,创建如下:

    //创建表,包含name,sex两列,文本类型,默认值为空  PRIMARY KEY AUTOINCREMENT主键自增

    db.execSQL("CREATE TABLE user("+

    "_id INTEGER PRIMARY KEY AUTOINCREMENT,"+

    "name TEXT DEFAULT\"\","+

    "sex TEXT DEFAULT\"\")");

    实例化ListView并为listview设置adapter

    lv= (ListView) findViewById(R.id.list);

    //只要adapter发生改变,setAdapter()函数就执行

    lv.setAdapter(adapter);

    设置刷新列表的函数,通过改变adapter的cursor从而改变adapter达到刷新列表的目的

    //更改adapter的Cursor,从而达到更新列表项

    private voidrefershListview(){

    Cursor c =dbRead.query("user",null,null,null,null,null,null);

    adapter.changeCursor(c);

    }

    执行refershListView后,adapter改变,setAdapter自动执行,列表刷新

    在button的onClick函数中,通过ContentValue存入数据,通过dbwriter将数据插入数据库

    插入完成后刷新列表

    public voidonClick(View v) {

    ContentValues cv =newContentValues();

    cv.put("name",etName.getText().toString());

    cv.put("sex",etSex.getText().toString());

    dbWrite.insert("user",null,cv);

    refershListview();

    }

    实现ListView长按删除item

    为listView设置onItemLongClickListener,返回值改为true,提示系统此次为长按操作,可以继续执行后续操作

    lv.setOnItemLongClickListener(newAdapterView.OnItemLongClickListener() {

    @Override

    public booleanonItemLongClick(AdapterView parent,View view, final intposition, longid) {

    //反馈操作系统此次是否为长按,true为长按,可触发震动等

    return true;

    通过AlertDialog创建对话框,设置title与message,通过积极按钮(positive Button)设置需要操作的button,铜过消极按钮(negative Button)设置不需要操作的button,positive button需要设置DialogInterface.onClickListener,negative button的事件监听器为null,通过show弹出对话框。

    newAlertDialog.Builder(MainActivity.this).setTitle("提醒").setMessage("你确定要删除该项吗?")

    .setPositiveButton("确定", newDialogInterface.OnClickListener() {

    通过adapter中的cursor移动到相应位置,通过dbWriter删除,删除后刷新列表

    //通过adapter获取到Cursor,并移动到长按的位置

    Cursor c =adapter.getCursor();

    //内部类访问可变变量有问题

    c.moveToPosition(position);

    //获取数据库中这条数据的_id

    intitemId = c.getInt(c.getColumnIndex("_id"));

    //删除对应的数据,参数为表名,删除的条件,条件的结果

    dbWrite.delete("user","_id=?",newString[]{itemId+""});

    refershListview();

    注意:数据库创建时的onCreate函数在没有数据库时才会创建,如需重新创建应先手动清除应用数据

    相关文章

      网友评论

          本文标题:Android中Sqlite数据库读写数据

          本文链接:https://www.haomeiwen.com/subject/inzhjxtx.html