Android学习之五种数据存储方式(二)

                      Android数据存储方式之SQLite数据库存储数据

        1.SQLite数据库简介
        1.1.SQLite是一种轻量级数据库系统,以嵌入式操作系统为设计目标,占用资源低,因此选择其作为手机操作系统的本地数据库,此外它还是开源的,任何人都可以使用。许多开源项目((Mozilla,PHP,Python)都使用了SQLite,同样Android运行的环境包含了完整的SQLite。
        1.2.特点:
        (1)、面向资源有限的设备。
        (2)、没有服务器进程(在语言中直接API调用)。
        (3)、所有数据存放在同一文件中,跨平台(定义、表、索引等)。
        (4)、可自由复制。
        1.3.SQLite支持的数据类型:

存储类型说明
NULL一个 NULL 值。
INTEGER一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。
REAL一个浮点值,存储为 8 字节的 IEEE 浮点数字。
TEXT一个文本字符串。
BLOB一个 二进制数据,完全根据它的输入存储。

        2. SQLite使用
        在Android中,SQLite的使用涉及两个重要的类,SQLiteOpenHelper和SQLiteDatabase。
        2.1.创建和访问数据库:SQLiteOpenHelper类。
        2.1.1、SQLiteOpenHelper是SQLite的数据库辅助类,是抽象类:
                    用来管理数据库的创建和版本。
        2.1.2、SQLiteOpenHelper的使用方法:
                创建一个类并继承SQLiteOpenHelper类。
                       构造函数:四个参数:上下文环境、数据库名字、游标、版本。
                       必须实现onCreate(SQLiteDatabase db)方法,来创建数据库。
                       必须实现onUpgrade(SQLiteDatabase db,int old, int new)方法。
                       建立后,需要调用getReadableDatabase()或 getWriteableDatabase()方法返回一个SQLite数据库对象来操作数据库。

        SQLiteOpenHelper 具体方法:

方法说明
onCreate(SQLiteDatabase db) 一个SQLiteDatabase对象作为参数,当数据库第一次被建立的时候被执行,例如创建表,初始化数据等。
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 需要三个参数,一个SQLiteDatabase对象,一个旧的数据库版本号(oldVersion)和一个新的数据库版本号(newVersion),当数据库需要被更新的时候执行,例如删除久表,创建新表,这样就可以把一个数据库从旧的模型转变到新的模型。
getReadableDatabase() 得到可读的数据库,返回SQLiteDatabase对象,然后通过对象进行数据库读取操作。
getWritableDatabase() 得到可写的数据库,返回SQLiteDatabase对象,然后通过对象进行数据库写入或者读取操作。
onOpen(SQLiteDatabase db) 当打开数据库时的回调函数。
close() 关闭数据库,需要强调的是,在每次打开数据库之后停止使用时调用,否则会造成数据泄露。

        2.2.SQLiteDatabase类。
        2.2.1、创建数据库—直接使用SQLiteDatabase类来创建数据库:
             定义SQLite数据库类:SQLiteDatabase对象并利用函数创建。
             使用openOrCreateDatabase(“dbname”,MODE_PRIVATE,null)创建数据库。
             创建数据库后,可以通过执行SQL语句的方式,创建表。
             数据库对象使用后,调用close()方法关闭数据库。
        2.2.2、使用SQLiteDatabase类来操作数据表:
             针对数据表的操作,SQLite可通过执行标准的SQL语句来实现。
             通过execSQL(String sqlstr)方法来实现对SQL语句的执行:
                    执行数据定义语言DDL:Create、Alter、Drop。
                    执行数据操作语言DML:Insert、Update、Delete。
             通过rawQuery(String sqlstr)方法来实现SQL查询并返回结果:
                    执行数据查询语言DQL:Select。
                    返回的结果类型为Cursor类对象。

方法说明
public long insert (String table, String nullColumnHack, ContentValues values) 用于往表中插入一条记录。table指定要插入数据的表的名称,values为一个ContentValues对象,类似一个map通过键值对的形式存储值,是要插入的记录的所有值,其中的键必须与表中的字段名相同。
public int delete (String table, String whereClause, String[] whereArgs) 用于删除表中的一条记录。table指定要删除数据的表的名称,whereClause指定要根据哪个列字段参数来进行删除,whereArgs是删除的具体依据参数。
public int update (String table, ContentValues values, String whereClause, String[] whereArgs) 用于修改数据表中的一条数据。table指定要删除数据的表的名称,whereClause指定要根据哪个列字段参数来进行删除,whereArgs是删除的具体依据参数。使用方法与delete 方法相同,values则只用来保存需要修改的值。
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) 用于查询数据表中的信息,获得指向对应要求数据的游标。table指定要删除数据的表的名称;columns指定需要查询的列,selection与selectionArgs参数使用与之前方法中whereClause与whereArgs相同;groupBy与having是与合计函数(Aggregate Functions),如SUM()一起使用的,一般设为null;orderBy指定查询数据顺序,可以以其中一个字段的升降序顺便查询,如以“ID”字段的降序排列,则orderBy为"ID DESC ",其中DESC代表降序的含义,而ASC代表升序;limit则指定限制查询数据的个数。

             使用游标Cursor—查询返回的数据集:
             常用方法:

方法说明
move(int offset) 以当前位置为参考,移动指定行。
moveToFirst()、moveToLast() 移动到第一行 、最后一行。
moveToPosition(int position) 移动到指定行 。
getColumnNames() 获取字段名。
getCount() 结果集中的数据项数 。
getPosition() 返回当前游标所指向的行数。
getString(int columnIndex) 返回当前行指定列的值。

        ☆☆☆Android Studio实现SQLite数据库存储数据。
        1.打开Android Studio,新建工程后,在activity_main.xml中,建立4个Button,1个ListView。
        2.新建类mSQLiteOH继承自SQLiteOpenHelper。

package lession.example.com.androidlession417_2;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class mSQLiteOH extends SQLiteOpenHelper {
    mSQLiteOH(Context ct, String name, SQLiteDatabase.CursorFactory cf,int vs){
        super(ct,name,cf,vs);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sqlStr = "Create table Student(id integer,name text,pwd text)";
        db.execSQL(sqlStr);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

        3.在MainActivity.java中,编写相关代码。

package lession.example.com.androidlession417_2;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btoh_wt = (Button) findViewById(R.id.button);
        Button btoh_rd = (Button) findViewById(R.id.button2);
        Button btdb_wt = (Button) findViewById(R.id.button3);
        Button btdb_rd = (Button) findViewById(R.id.button4);
        final ListView lv = (ListView) findViewById(R.id.listView);
        final mSQLiteOH mdbh = new mSQLiteOH(this,"stu.db",null,1);
        final SQLiteDatabase mSqldb = openOrCreateDatabase("mydb",MODE_PRIVATE,null);
        btoh_wt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = mdbh.getWritableDatabase();
                db.execSQL("insert into student values(1,'zhao','123')");
                db.execSQL("insert into student(name,pwd) values('qian','456')");
                db.execSQL("insert into student values(?,?,?)",new Object[]{3,"sun","789"});
                db.execSQL("insert into student values(4,'li','000')");
            }
        });
        btoh_rd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = mdbh.getReadableDatabase();
                Cursor mCs = db.rawQuery("select * from student",null);
                String dbStr[] = new String[mCs.getCount()];
                mCs.moveToFirst();
                for (int i=0;i<mCs.getCount();i++){
                    dbStr[i] = "记录"+i+":"+mCs.getInt(0)+" "+mCs.getString(1)+" "+mCs.getString(2);
                    mCs.moveToNext();
                }
                ArrayAdapter<String> mAd = new ArrayAdapter<String>(MainActivity.this,
                        android.R.layout.simple_list_item_1,dbStr);
                lv.setAdapter(mAd);
            }
        });
        btdb_wt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mSqldb != null){
                    mSqldb.execSQL("drop table if exists person");
                    mSqldb.execSQL("create table person(id integer,name text,pwd text)");
                }
                mSqldb.execSQL("insert into person values(101,'zhangsan','123')");
                mSqldb.execSQL("insert into person values(?,?,?)",new Object[]{102,"lisi","456"});
                mSqldb.execSQL("insert into person values(103,'wangwu','789')");
                ContentValues cv = new ContentValues();
                cv.put("id",104);
                cv.put("name","zhaoliu");
                cv.put("pwd","000");
                mSqldb.insert("person",null,cv);
            }
        });
        btdb_rd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Cursor mCs = mSqldb.rawQuery("select * from person",null);
                String[] dataSt = new String[mCs.getCount()];
                mCs.moveToFirst();
                for (int i=0;i<mCs.getCount();i++){
                    int id = mCs.getInt(0);
                    String name = mCs.getString(1);
                    String pwd = mCs.getString(mCs.getColumnIndex("pwd"));
                    dataSt[i] = "person"+i+":"+id+" "+name+" "+pwd;
                    mCs.moveToNext();
                }
                ArrayAdapter<String> mAda = new ArrayAdapter<String>(MainActivity.
                        this,android.R.layout.simple_list_item_1,dataSt);
                lv.setAdapter(mAda);
            }
        });
    }
}

        运行结果:
        点击oh_wt保存数据,点击oh_dr在ListView中显示出来,同理点击db_wt保存数据,点击db_dr在ListView中显示出来。
在这里插入图片描述
        打开Tools —> Android —> Android Device Monitor,找到对应文件。
在这里插入图片描述
        导出如下:
                在这里插入图片描述
        这就是SQLite数据库存储数据的使用,如果转载以及CV操作,请务必注明出处,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值