今天学习了android下的sqlite 。
知识记录:
1.SQLiteOpenHelper
SQliteOpenHelper是一个抽象类,来管理数据库的创建和版本的管理。要使用它必须实现它的nCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase, int, int)方法
onCreate:当数据库第一次被建立的时候被执行,例如创建表,初始化数据等。
onUpgrade:当数据库需要被更新的时候执行,例如删除久表,创建新表。
第一步:创建一个类继承
SQLiteOpenHelper
代码如下
package com.zaizai.sqlite;
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* Created by AnJie on 2015/10/8.
*/
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {
private static final String databases_name = "mydatabase.db";
private static final String databases_table = "person";
private static final int databases_version = 1;
private static final String KEY_ID = "_id";
/*创建数据库语句*/
private static final String databases_create = "create table person ( _id integer primary key autoincrement,name varchar(20),age integer);";
/**
* 数据库的构造函数
* @param context
*
* name 数据库名称
* factory 游标工程
* version 数据库的版本号 不可以小于1
*/
public PersonSQLiteOpenHelper(Context context) {
super(context, databases_name, null, 5);
}
/**
* @param context 环境上下文
* @param name 数据库名称
* @param factory
* @param version
*/
public PersonSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public PersonSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
super(context, name, factory, version, errorHandler);
}
/**
* 数据库第一次创建时回调此方法.
* 初始化一些表
* 创建表:
* create table person(
* _id integer primary key,
* name varchar(20),
* age integer
* );
*/
@Override
public void onCreate(SQLiteDatabase db) {
/*当磁盘上不存在数据库,辅助类需要创建一个新数据库时调用*/
db.execSQL(databases_create);
}
/**
* 数据库的版本号更新时回调此方法,
* 更新数据库的内容(删除表, 添加表, 修改表)
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("TaskDBAdapter", "upgrading from version" + oldVersion + "To" + newVersion + ",which will destroy all old data");
/*删除旧表*/
db.execSQL("DROP TABLE IF EXISTS "+databases_table);
/*创建新表*/
onCreate(db);
}
}
第二步:创建一个dao类
package com.zaizai.sqlite.dao;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import com.zaizai.sqlite.PersonSQLiteOpenHelper;
import com.zaizai.sqlite.damin.Person;
import java.util.ArrayList;
import java.util.List;
/**
* Created by AnJie on 2015/10/8.
*/
public class PersonDao {
private static final String TAG = "PersonDao";
private PersonSQLiteOpenHelper myOpenHelper = null;
public PersonDao(Context context) {
this.myOpenHelper = new PersonSQLiteOpenHelper(context);
}
public void inset(Person person) {
/**/
SQLiteDatabase db = null;
try {
db = myOpenHelper.getWritableDatabase();
} catch (Exception e) {
e.printStackTrace();
db = myOpenHelper.getReadableDatabase();
}
/**/
if (db.isOpen()) { // 如果数据库打开, 执行添加的操作
ContentValues values = new ContentValues();
values.put("name", person.getName()); // key作为要存储的列名, value对象列的值
values.put("age", person.getAge());
/*当value为null时,会在该列插入一个大写的Null SQLite不允许数据为null*/
long id = db.insert("person", "name", values);
Log.i(TAG, "id: " + id);
db.close(); // 数据库关闭
}
}
/**
* 更据id删除记录
*
* @param id
*/
public void delete(int id) {
SQLiteDatabase db = null;
try {
db = myOpenHelper.getWritableDatabase();
} catch (Exception e) {
e.printStackTrace();
db = myOpenHelper.getReadableDatabase();
}
if (db.isOpen()) { // 如果数据库打开, 执行添加的操作
String whereClause = "_id = ?";
String[] whereArgs = {id + ""};
int count = db.delete("person", whereClause, whereArgs);
Log.i(TAG, "删除了: " + count + "行");
db.close(); // 数据库关闭
}
}
/**
* 根据id找到记录, 并且修改姓名
*
* @param id
* @param name
*/
public void update(int id, String name) {
SQLiteDatabase db = null;
try {
db = myOpenHelper.getWritableDatabase();
} catch (Exception e) {
e.printStackTrace();
db = myOpenHelper.getReadableDatabase();
}
if (db.isOpen()) { // 如果数据库打开, 执行添加的操作
ContentValues values = new ContentValues();
values.put("name", name);
int count = db.update("person", values, "_id = ?", new String[]{id + ""});
Log.i(TAG, "修改了: " + count + "行");
db.close(); // 数据库关闭
}
}
public List<Person> queryAll() {
SQLiteDatabase db = null;
try {
db = myOpenHelper.getWritableDatabase();
} catch (Exception e) {
e.printStackTrace();
db = myOpenHelper.getReadableDatabase();
}
if (db.isOpen()) {
String[] columns = {"_id", "name", "age"}; // 需要的列
String selection = null; // 选择条件, 给null查询所有
String[] selectionArgs = null; // 选择条件的参数, 会把选择条件中的? 替换成数据中的值
String groupBy = null; // 分组语句 group by name
String having = null; // 过滤语句
String orderBy = null; // 排序
Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);
int id;
String name;
int age;
if (cursor != null && cursor.getCount() > 0) {
List<Person> personList = new ArrayList<Person>();
while (cursor.moveToNext()) { // 向下移一位, 知道最后一位, 不可以往下移动了, 停止.
id = cursor.getInt(0);
name = cursor.getString(1);
age = cursor.getInt(2);
personList.add(new Person(id, name, age));
}
db.close();
return personList;
}
db.close();
}
return null;
}
/**
* 根据id查询人
*
* @param id
* @return
*/
public Person queryItem(int id) {
SQLiteDatabase db = null;
try {
db = myOpenHelper.getWritableDatabase();
} catch (Exception e) {
e.printStackTrace();
db = myOpenHelper.getReadableDatabase();
}
if (db.isOpen()) {
String[] columns = {"_id", "name", "age"}; // 需要的列
String selection = "_id = ?"; // 选择条件, 给null查询所有
String[] selectionArgs = {id + ""}; // 选择条件的参数, 会把选择条件中的? 替换成数据中的值
String groupBy = null; // 分组语句 group by name
String having = null; // 过滤语句
String orderBy = null; // 排序
Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);
if (cursor != null && cursor.moveToFirst()) { // cursor对象不为null, 并且可以移动到第一行
int _id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
db.close();
return new Person(_id, name, age);
}
db.close();
}
return null;
}
}
里面可通过原生的sql语句进行操作,也可通过api,我这里使用的是api
db = {
db = .getWritableDatabase()} (e) {
e.printStackTrace()db = .getReadableDatabase()}
目的是为了防止权限不够的备用措施
原文:http://my.oschina.net/zaizaiangels/blog/514372