Android中的5种数据存储方式之——SQLite

来源:互联网 发布:js treeview drag区域 编辑:程序博客网 时间:2024/06/13 08:28

知识不用就会生疏,因为最近在做毕业设计的东西,需要用到数据库,今天复习一下数据库的一些东西。 从易到难巩固一下。

关于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、

待续、、、、、、、、、、、、、、、

A 、

A 、

0 0
原创粉丝点击