1.SQLite是安卓平台上集成的一个嵌入式关系型数据库。无需自动安装。
当需要是系统动态生成数据库。
每个应用的数据库位置:
/data/data/应用包名/databases/数据库
2.SQLiteOpenHelper
作用:用来创建,打开和管理数据库(创建表和更新表字段)。
1)写一个类继承SQLiteOpenHelper,并且要有构造方法,还要实现两个方法 onCreate onUpgrade
构造方法参数中,String name 表示数据库的名字;
version 表示数据库版本,从1开始。当version值改变时,会调用onUpgrade方法升级。
onCreate方法:数据库第一次创建时调用,在该方法中创建表。
onUpgrade方法:数据库升级时调用,当版本号改变时升级,一般在该方法中增加表的字段。
2)一般写成单例类。
3)getWritableDatabase()/getReadableDatabase()
调用这两个方法时,如果还没有数据库,那么会自动创建一个数据库并返回;如果已经存在,那么直接打开返回
3.SQLiteDatabase
1)通过helper获得实例
一般用完cursor后关闭游标:cursor.close();
*增删改 --- execSQL("增删改的SQL语句")
例:
3)面向对象方法
为了防止安卓程序员不会SQL语言,安卓还封装了一套面向对象的方法用于增删改查。
一般推荐使用这几个方法进行增删改查,因为可以与JavaBean对象结合。即表中每行对应一个JavaBean
*ContentValues
相当于Map --- 存放键值对
insert("表名", "空值字段", ContentValues);
如:database.insert("mm", "_id", values);
*查询
query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
如:database.query("mm", new String[]{"*"}, null, null, null, null, null); //查询所有
返回值 Cursor
*更新
update(table, values, whereClause, whereArgs)
如:database.update("mm", values, new String[]{"_id = ?"}, new String[]{"1"});
*删除
delete(table, whereClause, whereArgs)
如:database.delete("mm", new String[]{"_id = ?"}, new String[]{"1"});
方法:
得到某字段对应的索引: cursor.getColumnIndex("_id");
int _id = cursor.getInt(0);
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(1);
用完后将cursor关闭:cursor.close();
5.事务
保证事务的一致性,完整性和安全性。
database.beginTransaction();
database.setTransactionSuccessful();
database.endTransaction();
3.当每页显示固定数目且有上一页和下一页按钮时,判断是否是首页或最后一页条件
翻页时,startId数值的确定 startId = startId + block; //即下一页起始值是当前页起始值加上该页显示的数目
判断是否是首页:if(startId == 0) //当前已经是首页
判断是否是最后一页:if(startId + block >= cursor.getCount()) //当前页是最后一页
4.如果是将分页数据显示到listview,那么每点击一次上一页或下一页,都要进行刷新,因为分页查询返回Cursor,
所以直接 adapter.changeCursor(cursor);
当需要是系统动态生成数据库。
每个应用的数据库位置:
/data/data/应用包名/databases/数据库
2.SQLiteOpenHelper
作用:用来创建,打开和管理数据库(创建表和更新表字段)。
1)写一个类继承SQLiteOpenHelper,并且要有构造方法,还要实现两个方法 onCreate onUpgrade
构造方法参数中,String name 表示数据库的名字;
version 表示数据库版本,从1开始。当version值改变时,会调用onUpgrade方法升级。
onCreate方法:数据库第一次创建时调用,在该方法中创建表。
onUpgrade方法:数据库升级时调用,当版本号改变时升级,一般在该方法中增加表的字段。
2)一般写成单例类。
例:
public class MyOpenHelper extends SQLiteOpenHelper {
private static MyOpenHelper mInstance;
// 数据库名
private static String name = "MYDB.db";
private MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
//获取实例对象
public static MyOpenHelper getInstance(Context context) {
if (mInstance == null) {
mInstance = new MyOpenHelper(context, name, null, 1);
}
return mInstance;
}
@Override
public void onCreate(SQLiteDatabase db) {
// 创建表
db.execSQL("create table mm(_id integer primary key autoincrement, name text)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//当获取实例方法中version改变时调用upgrade方法
db.execSQL("alter table mm add age integer null");
}
}
3)getWritableDatabase()/getReadableDatabase()
调用这两个方法时,如果还没有数据库,那么会自动创建一个数据库并返回;如果已经存在,那么直接打开返回
3.SQLiteDatabase
1)通过helper获得实例
SQLiteDatabase database = helper.getWritableDatabase(); //getReadableDatabase()
2)方法
*查询 --- rawQuery("查询语句", "查询条件")
注:当查询语句中带有?时,查询条件为实际值。一般直接在查询语句中写全。
Cursor cursor = database.rawQuery("select * from m", null);
一般用完cursor后关闭游标:cursor.close();
*增删改 --- execSQL("增删改的SQL语句")
database.execSQL("insert into mm(name,age) values('小乔',22)");
database.execSQL("update mm set age = 18 where _id = 1");
database.execSQL("delete from mm where _id = 1");
例:
public class MainActivity extends Activity implements OnClickListener {
private SQLiteDatabase database;
private MyOpenHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 省略了按钮的初始化
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
//创建数据库
case R.id.create:
helper = MyOpenHelper.getInstance(this);
database = helper.getWritableDatabase();
break;
//查询
case R.id.query:
Cursor cursor = database.rawQuery("select * from mm", null);
while (cursor.moveToNext()) {
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(1);
int age = cursor.getInt(2);
System.out.println("_id = " + _id + " name = " + name
+ " age = " + age);
}
cursor.close();
break;
//插入
case R.id.insert:
database.execSQL("insert into mm(name,age) values('小昭',22)");
break;
//更新
case R.id.update:
database.execSQL("update mm set age = 18 where _id = 1");
break;
//删除
case R.id.delete:
database.execSQL("delete from mm where _id = 1");
break;
default:
break;
}
}
}
3)面向对象方法
为了防止安卓程序员不会SQL语言,安卓还封装了一套面向对象的方法用于增删改查。
一般推荐使用这几个方法进行增删改查,因为可以与JavaBean对象结合。即表中每行对应一个JavaBean
*ContentValues
相当于Map --- 存放键值对
ContentValues values = new ContentValues();
values.put("键", "值");
*增
insert("表名", "空值字段", ContentValues);
如:database.insert("mm", "_id", values);
*查询
query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
如:database.query("mm", new String[]{"*"}, null, null, null, null, null); //查询所有
返回值 Cursor
*更新
update(table, values, whereClause, whereArgs)
如:database.update("mm", values, new String[]{"_id = ?"}, new String[]{"1"});
*删除
delete(table, whereClause, whereArgs)
如:database.delete("mm", new String[]{"_id = ?"}, new String[]{"1"});
public class MMService {
private MyOpenHelper helper;
public MMService(Context context) {
helper = MyOpenHelper.getInstance(context);
}
public void insert(MM mm) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", mm.getName());
values.put("age", mm.getAge());
db.insert("mm", "_id", values);
db.close();
}
public List<MM> queryAll() {
SQLiteDatabase db = helper.getWritableDatabase();
List<MM> list = new ArrayList<MM>();
Cursor cursor = db.query("mm", new String[] { "*" }, null, null, null,
null, null);
while (cursor.moveToNext()) {
int _id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
MM mm = new MM();
mm.set_id(_id);
mm.setName(name);
mm.setAge(age);
list.add(mm);
}
cursor.close();
db.close();
return list;
}
public void update(MM mm) {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", mm.getName());
values.put("age", mm.getAge());
String whereClause = "_id = ?";
String[] whereArgs = { mm.get_id() + "" };
db.update("mm", values, whereClause, whereArgs);
db.close();
}
public void delete(int _id) {
SQLiteDatabase db = helper.getWritableDatabase();
String whereClause = "_id = ?";
String[] whereArgs = { _id + "" };
db.delete("mm", whereClause, whereArgs);
}
}
<span style="white-space:pre"> </span>public void onClick(View v) {
switch (v.getId()) {
case R.id.create:
helper = MyOpenHelper.getInstance(this);
database = helper.getWritableDatabase();
break;
case R.id.query:
List<MM> list = service.queryAll();
for (MM mm : list) {
System.out.println(mm);
}
break;
case R.id.add:
service.insert(new MM(1, "小乔", 22));
break;
case R.id.update:
service.update(new MM(1, "小乔", 18));
break;
case R.id.delete:
service.delete(1);
break;
default:
break;
}
}
方法:
得到某字段对应的索引: cursor.getColumnIndex("_id");
int _id = cursor.getInt(0);
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(1);
用完后将cursor关闭:cursor.close();
5.事务
保证事务的一致性,完整性和安全性。
database.beginTransaction();
database.setTransactionSuccessful();
database.endTransaction();
例:
try{
database.beginTransaction();
... //代码
//如果期间抛出异常,那么改行代码不会执行,则上面代码操作失败,代码业务不会发生改变
database.setTransactionSuccessful();
}catch(){
}finally{
database.endTransaction();
database.close();
}
*************************************
分页查询limit
1.SQL语句
select * from mm limit 0 , 3
开始查询的位置
每次查询数据数目
2.使用SQLiteDatabase的query方法进行分页查询
使用最后一个带limit参数的query方法:
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
/**
* 分页查询
* @param startId 该页的起始值
* @param block 每页显示的数目
* @return
*/
public Cursor limitedQuery(int startId, int block) {
SQLiteDatabase db = helper.getWritableDatabase();
return db.query("mm", new String[] { "*" }, null, null, null, null,
null, startId + "," + block);
}
3.当每页显示固定数目且有上一页和下一页按钮时,判断是否是首页或最后一页条件
翻页时,startId数值的确定 startId = startId + block; //即下一页起始值是当前页起始值加上该页显示的数目
判断是否是首页:if(startId == 0) //当前已经是首页
判断是否是最后一页:if(startId + block >= cursor.getCount()) //当前页是最后一页
4.如果是将分页数据显示到listview,那么每点击一次上一页或下一页,都要进行刷新,因为分页查询返回Cursor,
所以直接 adapter.changeCursor(cursor);