文件存储和SharedPreferences存储只适应保存简单的数据和键值对,而SQLite数据库是专门应对大数据存储。
SQLite数据库能存储复杂的类型数据之外,还有占用资源少、运行速度快、适合在移动设备上使用等优点。简单的说SQLite数据库是一款轻量级的关系型数据库。同时,SQLite数据库又比其他的数据库简单的多,比如mySQL数据库。SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。
为了方便管理数据库,专门提供了一个SQLiteOpenHelper帮助类。既然是帮助帮助类,都帮了些什么呢?可以说借助这个类我们可以对数据库进行创建和升级;比如需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。SQLiteOpenHelper虽说是个帮助类,其实SQLiteOpenHelper本身是个抽象类。想和SQLiteOpenHelper做朋友先从它的三个二开始吧!
第一个二:抽象类一般都需要写一个类继承它且重写它的方法。
//用于初次使用软件时生成数据库表
@Override
public void onCreate(SQLiteDatabase db) {
}
//用于升级软件时更新数据库表结构
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
}
第二个二:SQLiteOpenHelper 中还有两个非常重要的实例方法:getReadableDatabase() 和 getWritableDatabase()。getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,如果内存不足,getReadableDatabase()方法还回的对象是只读方式,getWritableDatabase()方法会报错。
第三个二:类都是有构造方法的,可以用系统默认的构造方法,可以自己重写构造方法。SQLiteOpenHelper中可提供两个构造方法重写,大家都用参数少的那个构造方法。
//context对数据进行操作,name是数据库名,factory表示允许我们在查询数据
//时返回一个自定义的Cursor,一般是传入null,version:数据库版本号
public MySQLite(Context context, String name,
SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
构建出 SQLiteOpenHelper 的实例之后,再调用它的 getReadableDatabase() 或 getWritableDatabase() 方法就能够创建数据库了,数据库文件会存放在 /data/data/<包名>/database/ 目录下。SQLiteOpenHelper数据类型:integer整型,real浮点型,text文本型,blob二进制型。
SQLiteOpenHelper创建和升级数据库:升级数据库的时候记得改下版本号。
package com.xhm.demo.myandroidsql;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;
/**
* Created by Dell on 2017/3/28.
*/
public class MySQLite extends SQLiteOpenHelper {
public static final String CREATE_BOOK="create table Book("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)";
public static final String CREATE_CATEGORY="create table Category("
+"id integer primary key autoincrement,"
+"category_name text"
+"category_code integer)";
private Context mContext;
//context对数据进行操作,name是数据库名,factory表示允许我们在查询数据
//时返回一个自定义的Cursor,一般是传入null,version:数据库版本号
public MySQLite(Context context, String name,
SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext=context;
}
//用于初次使用软件时生成数据库表
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库的同时创建Book表
db.execSQL(CREATE_BOOK);
db.execSQL(CREATE_CATEGORY);
Toast.makeText(mContext, "Create succeeded",
Toast.LENGTH_SHORT).show();
}
//用于升级软件时更新数据库表结构
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");
onCreate(db);
}
}
package com.xhm.demo.myandroidsql;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class SQLiteActivity extends Activity {
private MySQLite dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
//构建一个MyDatabaseHelper对象,
// 通过构造函数将数据库名指定为BookStore.db
dbHelper=new MySQLite(this,"BookStore.db",null,2);
Button buttonData=(Button) findViewById(R.id.create_database);
buttonData.setOnClickListener(new View.OnClickListener() {
/**
*调用getWritableDatabase() 方法
* 自动检测当前程序中 BookStore.db 这个数据库
* 如果不存在则创建该数据库并调用 onCreate() 方法
* 同时Book表也会被创建
*/
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
}
}
SQL语句都有增(insert)改(update)删(delete)查(query),SQLiteOpenHelper又是如何实现的呢?当你一个人无能为力的时候就找个对象呗!(开玩笑);其实啊!在调用SQLiteOpenHelper的getReadableDatabase() 或 getWritableDatabase() 方法时都会返回一个SQLiteDatabase对象,有了这个对象就可以进行增改删查咯!
向表中添加数据:
Button insertData=(Button) findViewById(R.id.insert_data);
insertData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
ContentValues values=new ContentValues();
//开始组装第一条数据
values.put("name","The Da Vinci Code");
values.put("author","Dan Brown");
values.put("pages",454);
values.put("price",16.96);
//插入第一条数据
db.insert("Book",null,values);
values.clear();
//开始组装第二条数据
values.put("name","The Lost Symbol");
values.put("author","Dan Brown");
values.put("pages",510);
values.put("price",19.95);
//插入第二条数据
db.insert("Book",null,values);
/**
* 这里SQLiteDatabase提供了添加数据的方法,
* insert(String table,String nullColumnHack,ContentValues values)
* table表示是表名,nullColumnHack一般用不上,传入null就行,
* values表示一个ContentValues对象,提供put()方法重载,用于向
* ContentValues中添加数据。
*/
}
});
更新表中的数据:
Button updateData=(Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
ContentValues values=new ContentValues();
//更改价格
values.put("price",10.99);
db.update("Book",values,"name=?",
new String[]{"The Da Vinci Code"});
/**
* 这里SQLiteDatabase提供了更新数据的方法,
* update(String table,ContentValues values,
* String whereClause,String[]{whereArgs})
*table表示是表名,values表示一个ContentValues对象
* whereClause(对应SQL语句的where)和whereArgs:
* 指定具体更新那几行.
*/
}
});
删除表中的数据:
Button deleteData=(Button) findViewById(R.id.delete_data);
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
db.delete("Book","pages>?",new String[]{"500"});
/**
* 这里SQLiteDatabase提供了删除数据的方法,
*delete(String table,String whereClause,
* String[]{whereArgs}),删除数据和更新数据很相似,
* 就差了个ContentValues values,第二第三参数用于
* 指定删除某行或某几行的数据。
* */
}
});
查询表中的所有数据:
Button queryData=(Button) findViewById(R.id.query_data);
queryData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db=dbHelper.getWritableDatabase();
Cursor cursor=db.query("Book",null,null,
null,null,null,null);
if (cursor.moveToFirst()){
do {
//查询Book表中所有的数据
String name=cursor.getString(
cursor.getColumnIndex("name"));
String author=cursor.getString(
cursor.getColumnIndex("author"));
int pages=cursor.getInt(
cursor.getColumnIndex("pages"));
double price=cursor.getDouble(
cursor.getColumnIndex("price"));
Log.d("SQLiteActivity","book name is"+name);
Log.d("SQLiteActivity","book author is"+author);
Log.d("SQLiteActivity","book pages is"+pages);
Log.d("SQLiteActivity","book price is"+price);
}while (cursor.moveToNext());
}
cursor.close();//关闭数据库连接
/**
* 这里SQLiteDatabase提供了查询数据的方法,相对增删改要难,
* query(String table,String[] columns,String selection,
* String[] selectionArgs,String groupBy,String having,
* String orderBy,String limit);
* table:表名,columns:表中字段数据,selection:条件字句,
* 相对于where字句,selectionArgs:条件字句数组对应的值,
* groupBy:分组字段,having:分组条件,orderBy:排序,
* limit:分页查询限制。
* Cursor:返回结果集,相对于JDBC中的ResultSet.
* Cursor是一种游标,类似于移动指针,常用方法如下:
* getCount()获取总数据条数
* moveToFirst()移动到第一条数据的位置
* moveToLast()移动到最后一条数据的位置
* moveToNext()移动到下一条数据位置
* moveToPrecious()移动到上一条数据位置
* isFirst()判断是否为第一条数据
* isLast()判断是否为最后一条数据
* move(int offset)移动到指定的数据位置
* getXXX获取相应的数据类型值
* */
}
});
怎么看都有些复杂,确实是比SQL语句难一些,安卓系统也是支持SQL语句的,大家最好两个都掌握哈!