01_android下数据库的创建(重点)
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外,在编写CREATE TABLE 语句时,你可以省略跟在字段名称后面的数据类型信息,如下面语句你可以省略 name字段的类型信息:
CREATE TABLE person (_id integer primary key autoincrement, name varchar(20));
SQLite可以解析大部分标准SQL语句,如:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘传智’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘传智‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person where id=10
获取添加记录后自增长的ID值:SELECT last_insert_rowid()
SQLiteOpenHelper:管理数据库的版本;
在android应用程序中创建按数据库的步骤:
1、写一个DBHelper,继承了SQLiteOpenHelper,重新写了父类的构造方法、onCreate、onUpGrade:
//创建数据库
DBHelper helper = new DBHelper(this, "account.db", null, 1);
onCreate是在数据库创建的时候调用的,主要用来初始化数据表结构和插入数据初始化的记录
onUpGrade是在数据库版本升级的时候调用的,主要用来改变表结构
2、调用db = helper.getWritableDatabase(),得到数据对象
数据库的存储位置:/data/data/包名/databases/数据库名
##02_数据库sql语句的增删改查
##03_android下数据库的增删改查(重点)
代码:
package com.itheima.db;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DBHelper helper = new DBHelper(this, "itheima.db", null, 1);
db = helper.getWritableDatabase();
}
public void insert(View view) {
db.execSQL("insert into account (name,money) values ('liufeng','1000000')");
}
public void update(View view) {
db.execSQL("update account set money = '10000000' where name='liufeng'");
}
public void query(View view) {
// 查询数据库返回一个结果集
Cursor cursor = db.rawQuery("select * from account where name = ?",
new String[] { "liufeng" });
while (cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
String money = cursor.getString(2);
System.out.println("id="+id+"; name="+name+"; money="+money);
}
cursor.close();
}
public void delete(View view) {
db.execSQL("delete from account where name=?",new String[]{"liufeng"});
}
}
##04_数据库的另外一种增删改查方法(重点)
代码:
-
DBHelper.java:
package com.itheima.db; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { /** * * @param context * 上下午对象 * @param name * 数据库的名称 * @param factory * 游标工厂 ,null表示使用系统默认的游标工厂 * @param version * 数据库的版本号,最小为1,升级时版本号应该增加 */ public DBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } // public DBHelper(Context context) { // super(context, name, factory, version); // } /** * 初始化数据库实例时调用这个方法 创建表结构,添加初始数据记录 * * db:数据库实例对象 */ @Override public void onCreate(SQLiteDatabase db) { System.out.println("======onCreate============"); String sql = "create table account (_id integer primary key autoincrement,name varchar(20),money varchar(20))"; // 创建表结构 db.execSQL(sql); } public void insert(SQLiteDatabase db, String table, ContentValues values) { // //使用类似map的数据结构存储数据 // ContentValues values = new ContentValues(); // values.put("name", "liufeng"); // values.put("money", "1000000"); // 插入数据 db.insert("account", null, values); // 如果不关闭,数据库连接会一直存在导致内存不够用或者数据库被锁定 db.close(); } public void update(SQLiteDatabase db, String table, ContentValues values, String whereClause, String[] whereArgs) { // //使用类似map的数据结构存储数据 // ContentValues values = new ContentValues(); // values.put("name", "liufeng"); // values.put("money", "1000000"); // 插入数据 db.update(table, values, whereClause, whereArgs); // 如果不关闭,数据库连接会一直存在导致内存不够用或者数据库被锁定 db.close(); } public Cursor query(SQLiteDatabase db, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) { Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy); return cursor; } public void delete(SQLiteDatabase db, String table, String whereClause, String[] whereArgs) { db.delete(table, whereClause, whereArgs); db.close(); } /** * 升级数据库时调用这个方法 * * 修改表结构,升级数据库 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("======onUpgrade============"); } }
MainActivity.java:
package com.itheima.db;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
private SQLiteDatabase db;
private DBHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper = new DBHelper(this, "itheima.db", null, 1);
db = helper.getWritableDatabase();
}
public void insert(View view) {
// 使用类似map的数据结构存储数据
ContentValues values = new ContentValues();
values.put("name", "liufeng");
values.put("money", "1000000");
helper.insert(db, "account", values);
}
public void update(View view) {
// db.execSQL("update account set money = '10000000' where name='liufeng'");
ContentValues values = new ContentValues();
values.put("money", "10000000");
helper.update(db, "account", values, "name=?",
new String[] { "liufeng" });
}
public void query(View view) {
// 查询数据库返回一个结果集
Cursor cursor = helper.query(db, "account", new String[] { "name",
"money" }, "name=?", new String[] { "liufeng" }, null, null,
null);
while (cursor.moveToNext()) {
String name = cursor.getString(0);
String money = cursor.getString(1);
System.out.println(" name=" + name + "; money="
+ money);
}
cursor.close();
}
public void delete(View view) {
helper.delete(db, "account", "name=?", new String[]{"liufeng"});
}
}
##05_命令行查看数据库
使用SQLite的命令查看远程设备上的数据库;
步骤:
1.使用adb shell :切换到linux系统中;
2.使用cd命令切换到 数据库文件 所在的目录:/data/data/com.itheima.sqlite/databases/
3.使用sqlite3 数据库文件名.db 打开数据库;
##06_数据库的事务(重点)
事务:一组数据库操作要么同时成功要么同时失败;
从liufeng账户转出100万,给panxu;
liufeng-1000000
panxu+1000000
示例:
public void trans() {
// //使用类似map的数据结构存储数据
// ContentValues values = new ContentValues();
// values.put("name", "liufeng");
// values.put("money", "1000000");
// 插入数据
SQLiteDatabase db = this.getWritableDatabase();
try {
//开启事务
db.beginTransaction();
…
ContentValues values = new ContentValues();
values.put("money", "9900000");
db.update("account", values, "name=?", new String[]{"liufeng"});
ContentValues values02 = new ContentValues();
values02.put("money", "100100");
db.update("account", values, "name=?", new String[]{"panxu"});
//告诉数据库事务提交成功
db.setTransactionSuccessful();
values.put("money", "9900000");
db.update("account", values, "name=?", new String[]{"liufeng"});
ContentValues values02 = new ContentValues();
values02.put("money", "100100");
db.update("account", values, "name=?", new String[]{"panxu"});
....
} catch (Exception e) {
e.printStackTrace();
}finally{
//结束事务
db.endTransaction();
}
// 如果不关闭,数据库连接会一直存在导致内存不够用或者数据库被锁定
db.close();
}