Android数据存储之SQLite使用
SQLite是一款开源的、嵌入式关系型数据库,第一个版本Alpha发布于2000年。SQLite在便携性、易用性、紧凑性、高效性和可靠性方面有着突出的表现。
在Android中创建的SQLite数据库存储在:/data/data/<包名>/databases/目录下。
主要特点:
-轻量级
-独立性,没有不依赖,无需安装
-跨平台,支持众多操作系统
-支持高达2TB大小的数据库
-每个数据库以单个文件的形式存在
-以B-Tree的数据结构形式存储在硬盘
SQLite的数据类型:
SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型
分别代表:空值、整型值、浮点值、字符串值、二进制对象。
动态数据类型(弱引用):
当某个值插入到数据库中时,SQLite将会检测它的数据类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。
在Android中使用SQLite主要涉及两个类:
SQLiteDatabase和SQLiteOpenHelper,下面对这两个类进行主要的分析。
SQLiteDatabase
这个类提供了一些管理SQLite数据库的方法,比如创建、删除、执行SQL命令,和执行其他常见的数据库管理任务的方法。每个程序的数据库名字是唯一的。
常用方法:
db.execSQL(String sql) //执行任何的SQL语句
db.insert(String table,String nullColumnHack,ContentValues values) //插入记录
db.delete(String table,String whereClause,String[] whereArgs)//删除记录
db.update(String table,ContentValues values,String whereClause,String[] whereArgs)//更新记录
db.query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)//查询记录
db.rawQuery(String sql,String[] selectionArgs)//通过sql语句查询记录
下面是一个简单操作SQLite数据库的示例:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//每个程序都有自己的数据库
//通过openOrCreateDatabase来打开或创建一个数据库,返回SQLiteDatabase对象
SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null);
//创建一个表
db.execSQL("create table if not exists userTb (" +
"_id integer primary key," +
"name text not null,age integer not null," +
"sex text not null)");
//向表中插入记录
db.execSQL("insert into userTb (name,age,sex) values ('张三',18,'女')");
db.execSQL("insert into userTb (name,age,sex) values ('李四',19,'男')");
db.execSQL("insert into userTb (name,age,sex) values ('王五',20,'女')");
//Cursor为查询结果对象,类似于JDBC中的ResultSet
Cursor queryResult = db.rawQuery("select * from userTb", null);
if (queryResult != null) {
while (queryResult.moveToNext()) {
Log.i("info", "id: " + queryResult.getInt(queryResult.getColumnIndex("_id"))
+ " 姓名: " + queryResult.getString(queryResult.getColumnIndex("name"))
+ " 年龄: " + queryResult.getInt(queryResult.getColumnIndex("age"))
+ " 性别: " + queryResult.getString(queryResult.getColumnIndex("sex")));
}
//关闭游标对象
queryResult.close();
}
//关闭数据库
db.close();
}
}
当执行完openOrCreateDatabase("user.db",MODE_PRIVATE,null)后,会在/data/data/<包名>/databases/目录下创建一个数据库文件,打开DDMS可以查看。也可以将其导出,使用navigate等工具打开查看里面的数据。
另外,上述示例对记录的操作是使用execSQL()方法通过原生的SQL语句进行的,当然也可以使用上面介绍的SQLiteDatabase常用的方法来操作,如insert()、delete()、update()、query()等方法。但是需要注意的是,以插入记录举例,当数据量不大时,通过execSQL()使用SQL语句进行插入与使用insert()方法插入记录的效率是差不多的,但是如果数据量比较大,那么使用前者比使用后者的效率明显高出很多。
SQLiteOpenHelper
这个类为SQLiteDatabase的帮助类,主要用于管理数据库的创建与版本更新。SQLiteHelper是一个抽象类,一般通过创建一个继承自它的子类并重写onCreat()和onUpgrade()方法进行使用。
-onCreat(SQLiteDatabase db) //首次创建数据库时调用,一般用于建表等操作。
-onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)//当升级数据库版本时调用
下面是使用SQLiteOpenHelper的一个简单示例:
创建一个继承自SQLiteOpenHelper的子类
public class SQLiteHelper extends SQLiteOpenHelper {
public SQLiteHelper(Context context, String name) {
super(context, name, null, 1);
}
//首次创建数据库的时候调用,一般进行建表或某些初始化的操作
@Override
public void onCreate(SQLiteDatabase db) {
//建表
db.execSQL("create table if not exists userTb (" +
"_id integer primary key," +
"name text not null,age integer not null," +
"sex text not null)");
}
//当数据库版本升级时自动调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
然后就可以通过SQLiteHelper的实例获取一个SQLiteDatabase对象,进而对数据库进行一系列的操作了。
public class MainActivity2 extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//创建一个SQLiteHelper对象
SQLiteHelper helper = new SQLiteHelper(MainActivity2.this,"stu.db");
//使用getWritableDatabase()或getReadableDatabase()方法获得SQLiteDatabase对象
SQLiteDatabase db = helper.getWritableDatabase();
//插入记录
db.execSQL("insert into userTb (name,age,sex) values ('张三',18,'女')");
db.execSQL("insert into userTb (name,age,sex) values ('李四',19,'男')");
db.execSQL("insert into userTb (name,age,sex) values ('王五',20,'女')");
//获取游标对象
Cursor queryResult = db.rawQuery("select * from userTb", null);
if (queryResult != null) {
//打印所有记录
while (queryResult.moveToNext()) {
Log.i("info", "id: " + queryResult.getInt(queryResult.getColumnIndex("_id"))
+ " 姓名: " + queryResult.getString(queryResult.getColumnIndex("name"))
+ " 年龄: " + queryResult.getInt(queryResult.getColumnIndex("age"))
+ " 性别: " + queryResult.getString(queryResult.getColumnIndex("sex")));
}
//关闭游标对象
queryResult.close();
}
//关闭数据库
db.close();
}
}
您可能感兴趣的文章:Android使用Sqlite存储数据用法示例详解Android数据存储—使用SQLite数据库Android SQLite数据库彻底掌握数据存储Android SQLite数据库增删改查操作的使用详解Android使用SQLite数据库的简单实例android创建数据库(SQLite)保存图片示例android开发教程之listview显示sqlite数据Android中操作SQLite数据库快速入门教程Android创建和使用数据库SQLIteAndroid SQLite数据库增删改查操作的案例分析Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解Android开发之使用SQLite存储数据的方法分析
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341