知识不用就会生疏,因为最近在做毕业设计的东西,需要用到数据库,今天复习一下数据库的一些东西。 从易到难巩固一下。
关于SQLite几个牛逼博客
郭霖:http://blog.csdn.net/sinyu890807/article/category/2522725
郭大侠部分内容详细解析:
http://www.tuicool.com/articles/aaAnMnA
凯风:http://blog.csdn.net/flowingflying/article/details/6846991
关于SQLite几个牛逼框架
http://www.codeceo.com/article/5-android-orm-framework.html
哈哈,个人感觉xUtils用的也还顺手,或者说用郭大侠的LitePal。
传统sqlite工具类:
http://forhope.iteye.com/blog/1461412
SQLite特点主要包括:
1、 轻量级 一个动态库、单文件
2、 独立性 没有依赖、无须安装
3、 隔离性 全部在一个文件夹中
4、 跨平台 支持众多操作系统
5、 多语言接口 支持众多编程语言
6、 安全性 事务
关于事务处理的安全性:
通过数据库上的独占性和共享锁来实现独立事务处理 多个进程可以同一时间从同一个数据库读取数据,但只有一个可以写入数据。
SQLite的数据类型:
SQLite支持NULL、INTEGER、REAL、TEXT、BLOB数据类型
-依次代表:空值、整型值,浮点值,字符串值,二进制对象
动态数据类型(弱引用):
当某个值插入到数据库时,SQLite会检查他的数据类型,如果该类型与关联的列类型不匹配,SQLite就会尝试将该值转换成该列的类型,如果不能转换,该值将作为本身的类型存储。
使用须知:
-由于资源占用少、性能良好和零管理成本,嵌入式数据库有了他的用武之地。例如Android、IOS
-没有可用于SQLite的网络服务器、只能通过网络共享可能存在文件锁定或者性能问题。
-只提供数据库级的锁定。
-没有用户账户概念,而是根据文件系统确定所有数据库的权限
OK,下面还是通过实例来复习吧!
实例A 、
一,新建一个项目
二,每个程序都有自己的数据库 默认情况下是各自互相不干扰
三,创建一个数据库 并且打开
1 -使用openOrCreateDatabase建一个数据库(会创建一个文件夹)
2 -三个参数name:名字,后续用.db可以用第三方工具打开
3- mode :权限
4- factory:无介绍
四,用SQL创建一张表
db.execSQL("create table if not exists usertb (_id integer primary key autoincrement,name text not null,age integer not null, sex text not null)");
创建数据:
db.execSQL("insert into usertb(name,sex,age) values('剑姬','女',18)");// 插入数据
五,使用db.rawQuery(sql,selectionArgs)
sql:sql的语句
selectionArgs:查询条件 ,null查询全部数据
六,Cursor:
查询结果赋值给Cursor
Cursor c = db.rawQuery(“select * from usertb”,null);
创建if语句 里面嵌套while循环 21:00
while循环外 用c.close();作为游标释放
if循环外 用db.close(); 作为数据库释放
关于游标的内容可以查看一下这里的内容这里写链接内容
附上代码:MainActivity.java
public class MainActivity extends Activity {
private TextView tView;
private SQLiteDatabase db;
List<String> list;
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView);
// 每个程序都有自己的数据库 默认情况下是各自互相不干扰
// 创建一个数据库 并且打开
db = openOrCreateDatabase("lol.db", MODE_PRIVATE, null);// (数据库名称,权限,数据工厂)
db.execSQL("create table if not exists loldb (_id integer primary key autoincrement, name text not null , age integer not null , sex text not null )");// 执行任何SQL语句
db.execSQL("insert into loldb(name,sex,age) values('剑姬','女',18)");// 插入数据
db.execSQL("insert into loldb(name,sex,age) values('剑圣','男',19)");// 插入数据
db.execSQL("insert into loldb(name,sex,age) values('剑魔','男',20)");// 插入数据
db.execSQL("insert into loldb(name,sex,age) values('剑豪','男',20)");// 插入数据
list = new ArrayList<String>();
Cursor c = db.rawQuery("select * from loldb", null);// 可以理解为一个集合
if (c != null) {
while (c.moveToNext()) {
Log.i("info", "_id:" + c.getInt(c.getColumnIndex("_id")));
Log.i("info", "name:" + c.getString(c.getColumnIndex("name")));
Log.i("info", "age:" + c.getInt(c.getColumnIndex("age")));
Log.i("info", "sex:" + c.getString(c.getColumnIndex("sex")));
Log.i("info", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
}
c.close();// 关闭游标
db.close();// 关闭数据库
}
}
那么将见好的内容导出来的话可以看见里面建好了一个数据库文件
在使用数据库可视化工具查看可以看见里面的内容
实例B 、
这样的方法呢,比第一种好那么点点吧。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SQLiteDatabase db = openOrCreateDatabase("mylol.db", MODE_PRIVATE, null);
db.execSQL("create table if not exists loldb(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)");
ContentValues values = new ContentValues();
// ContentValues 和HashTable类似都是一种存储的机制
// 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象。
values.put("name", "女警");// 存放键值对
values.put("sex", "女");
values.put("age", 19);
long rowId = db.insert("loldb", null, values);// 插入值
values.clear();// 清空ContentValues对象
values.put("name", "寒冰");
values.put("sex", "女");
values.put("age", 18);
db.insert("loldb", null, values);
values.clear();
values.put("name", "萝莉");
values.put("sex", "女");
values.put("age", 20);
db.insert("loldb", null, values);
values.clear();
values.put("name", "德莱文");
values.put("sex", "男");
values.put("age", 21);
db.insert("loldb", null, values);
values.clear();
values.put("name", "男枪");
values.put("sex", "男");
values.put("age", 22);
db.insert("loldb", null, values);
values.clear();
values.put("sex", "女");
db.update("loldb", values, "_id>?", new String[] { "3" });// 将全部id>3的人的性别改成女
db.delete("loldb", "name like ?", new String[] { "%女%" });// 删除所有名字中带有女的人
Cursor c = db.query("loldb", null, "_id>?", new String[] { "0" }, null,
null, "name");
if (c != null) {
String[] columns = c.getColumnNames();
while (c.moveToNext()) {
for (String columnName : columns) {
Log.i("info", c.getString(c.getColumnIndex(columnName)));
}
}
c.close();
}
db.close();
}
}
实例 C 、
这里的话说说最长用的那种吧,,,
新建一个java类 继承SQLiteOpenHelper
重写里面的两个方法
onCreate
onCreate(SQLiteDatabase db):用户初次使用软件时生成数据库,一旦数据库存在则不会调用此方法。函数是在第一次创建数据库的时候执行的,仅仅生成DataBaseHelper对象(SQLiteOpenHelper类型)的时候是不会调用该函数的,而只有当调用DataBaseHelper对象的getReadableDataBase时或者是调用了getWritableDataBase时,如果是第一次创建数据库,那么就一定会调用onCreate()函数。
onUpgrade
onUpgrade(SQLiteDatabase db,int oldVersion,int vewVersion):用于升级软件时更新数据库表结构,如增加表、列字段等操作。
提示一下,在软件升级前,最好对原有数据进行备份,在新表建好后把数据导入新表中。
下面还是来看实例吧。
public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context, String name) {
super(context, name, null, 1);
}
public DBOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
@Override
// 首次创建数据库的时候调用 一般可以把建库 建表的操作
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists girldb(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)");
db.execSQL("insert into girldb(name,sex,age)values('baby','女',26)");
}
@Override
// 当数据库的版本发生变化的时候 会自动执行
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DBOpenHelper helper = new DBOpenHelper(MainActivity.this, "girl.db");
// helper.getReadableDatabase();//获取一个只读的数据库 只能查询 不能写入 不能更新
SQLiteDatabase db = helper.getWritableDatabase();
// db.query(table, columns, selection, selectionArgs, groupBy, having,
// orderBy)
Cursor c = db.rawQuery("select * from girldb", null);
if (c != null) {
String[] cols = c.getColumnNames();
while (c.moveToNext()) {
for (String ColumnName : cols) {
Log.i("info",
ColumnName + ":"
+ c.getString(c.getColumnIndex(ColumnName)));
}
}
c.close();
}
db.close();
}
}
实例D、
待续、、、、、、、、、、、、、、、