转载请标明出处:http://blog.youkuaiyun.com/wu_lai_314/article/details/43603787
在android应用中,对数据进行保存有很多种方式,比如通过网络上传到服务器,保存到本地自定义文件,保存到 sharedpreferences,或者保存到本地数据库。SQLite 作为一种轻量级的数据库,在移动设备(android,ios)中的表现尤为突出。麻雀虽小,五脏俱全。其他大型数据库拥有的常见功能,sqlite上也都有,sql语句的语法也大同小异。在该阶段学习使用sqlite的过程中,总结此文,作为学习笔记,也帮助入门菜鸟(PS:欢迎大牛指教)
android系统自带了很多api来帮助开发者使用sqlite, 其中最关键的需要用到两个类:SQLiteOpenHelper 和 SQLiteDatabase 类。前者是作为一个辅助类存在。下面列出
方法名 | 方法描述 |
---|---|
SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version) | 构造方法,一般是传递一个要创建的数据库名称那么参数 |
onCreate(SQLiteDatabase db) | 创建数据库时调用 |
onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) | 版本更新时调用 |
getReadableDatabase() | 创建或打开一个只读数据库 |
getWritableDatabase() | 创建或打开一个读写数据库 |
附:
SQLiteOpenHelper 初始化的时候只会执行构造函数,不会执行函数onCreate(...) 和 onUpgrade(...) ,当调用getReadableDatabase或者getWritableDatabase函数时候,才会函数onCreate(...)。如果已经调用过了下次,执行getReadableDatabase或者getWritableDatabase函数时候系统不再调用onCreate函数
现在写一个小Demo 作为示例 (示例简单以至于应用程序界面上不会提示,详细过程会在logcat打印出来)
工程截图:
关键代码:
自定义 DBHelper 继承自SQLiteHelper
package com.example.sqldemo.data;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper{
private static final String TAG = "DBHelper";
public DBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
public DBHelper(Context context,String name,int version) {
this(context, name, null, version);
}
public DBHelper(Context context,String name) {
this(context, name, DBConstant.DATABASE_VERSION);
}
public DBHelper(Context context) {
this(context, DBConstant.DATABASE_NAME);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table person(_id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(20),age int)";
db.execSQL(sql);
System.out.println(TAG + " 数据库 DBHelper onCreate");
}
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
System.out.println(TAG + " 数据库 DBHelper onUpgrade");
}
}
onCreate函数中可以写sql语句,在第一次调用时候创建数据库,但是如果数据表比较多的话,建议在assert目录下新建一个文件写sql语句,这样只要在第一次调用onCreate函数时候读取文件内容即可
DBConstant 类,方便数据库变量的管理
package com.example.sqldemo.data;
public class DBConstant {
public static final String DATABASE_NAME = "demo.db3";
public static final int DATABASE_VERSION = 1;
}
自定义数据库操作类SQLDemoDatabase ,对数据库操作进行封装
package com.example.sqldemo.data;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class SQLDemoDatabase {
private static final String TAG = "SQLDemoDatabase";
private SQLiteDatabase db;
private DBHelper dbHelper;
public SQLDemoDatabase(DBHelper _dbHelper) {
dbHelper = _dbHelper;
}
//增加数据
public void insertData() {
db = dbHelper.getReadableDatabase();
//方法一:使用execSQL 插入
db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new Object[]{"zhangsan", 10});
//方法二:使用insert方法插入
//实例化一个ContentValus用来装载待插入的数据
ContentValues cv = new ContentValues();
cv.put("name", "lisi");
cv.put("age", 12);
db.insert("person", null, cv);
System.out.println(TAG + " insertData");
db.close();
}
//删除数据
public void deleteData() {
db = dbHelper.getReadableDatabase();
//方法一:使用execSQL方式实现
db.execSQL("delete from person where name='zhangsan'");
//方法二:
String whereClause = "name=?";//删除的条件
String[] whereArgs = {"lisi"};//删除条件的参数
db.delete("person", whereClause, whereArgs);
System.out.println(TAG + " deleteData");
db.close();
}
//修改数据
public void updateData() {
db = dbHelper.getReadableDatabase();
//方法一:使用execSQL方式实现
db.execSQL("update [person] set age = 5 where name = 'zhangsan'");
//方法二:
ContentValues cv = new ContentValues();//实例化ContentValues
cv.put("age", 15);//添加要修改的字段及内容
String whereClause = "name=?";//修改条件
String[] whereArgs = {"lisi"};//添加要修改条件的参数
db.update("person", cv, whereClause, whereArgs);
System.out.println(TAG + " updateData");
db.close();
}
//查询数据
public void queryData() {
db = dbHelper.getReadableDatabase();
//方法一:使用rawQuery实现的带参数查询
Cursor c = db.rawQuery("select * from person where name=?", new String[]{"zhangasan"});
if(c.getCount() > 0) {
while(c.moveToNext()) {
String name = c.getString(c.getColumnIndex("name"));
int age = c.getInt(c.getColumnIndex("age"));
System.out.println("Person:[" + name + "," + age +"]");
}
} else {
System.out.println(TAG + " 无记录");
}
//方法二
Cursor c2 = db.query("person", null, null, null, null, null, null, null);
if(c2.getCount() > 0) {
while(c2.moveToNext()) {
String name = c2.getString(c.getColumnIndex("name"));
int age = c2.getInt(c.getColumnIndex("age"));
System.out.println("Person:[" + name + "," + age +"]");
}
} else {
System.out.println(TAG + " 无记录");
}
System.out.println(TAG + " queryData");
db.close();
}
}
MainActivity 类
package com.example.sqldemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import com.example.sqldemo.data.DBHelper;
import com.example.sqldemo.data.SQLDemoDatabase;
public class MainActivity extends ActionBarActivity implements OnClickListener{
private static final String TAG = "MainActivity";
private Context context;
private DBHelper dbHelper;
private SQLiteDatabase db;
private SQLDemoDatabase sqlDB;
private Button btnAdd;
private Button btnDel;
private Button btnUpdate;
private Button btnQuery;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
public void init() {
context = getApplicationContext();
//初始化按钮
btnAdd = (Button)findViewById(R.id.btn_add);
btnDel = (Button)findViewById(R.id.btn_del);
btnUpdate = (Button)findViewById(R.id.btn_update);
btnQuery = (Button)findViewById(R.id.btn_query);
//设置监听
btnAdd.setOnClickListener(this);
btnDel.setOnClickListener(this);
btnQuery.setOnClickListener(this);
btnUpdate.setOnClickListener(this);
//初始化一个数据库辅助类
dbHelper = new DBHelper(context);
//自定义的数据库封装类,对数据库的增删改查操作进行封装
sqlDB = new SQLDemoDatabase(dbHelper);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_add:
sqlDB.insertData();
Toast.makeText(context, "add", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_del:
sqlDB.deleteData();
Toast.makeText(context, "del", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_update:
sqlDB.updateData();
Toast.makeText(context, "update", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_query:
sqlDB.queryData();
Toast.makeText(context, "query", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
源码下载地址:http://download.youkuaiyun.com/detail/wu_lai_314/8431203
下载标明出处: http://blog.youkuaiyun.com/wu_lai_314/article/details/43603787