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操作,请务必注明出处,谢谢!