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

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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值