android平台下的SQLite数据库是一种轻量级数据库,支持标准的SQL语句。

本文将介绍

  • android数据库的创建
  • 利用sql语句对数据库增删改查
  • 系统api数据库增删改查
  • 数据库的事务
  • 1,数据库的创建

    步骤:

  • 写一个类继承SQLiteOpenHelper
  • 在构造函数中指定 数据库名称,游标工厂, 版本号
  • 初始化数据库,执行getWritableDatabase或getReadableDatabase, 创建或打开一个数据库.
  • onCreate里执行SQL创建语句

  • android平台下数据库的创建需要一个辅助类继承SQLiteOpenHelper,并且需要重写父类的构造方法。

  • /**
    * 数据库创建辅助类 写一个类继承SQLiteOpenHelper
    *
    * @author wgk
    *
    */
    public class PersonSQLiteOpenHelper extends SQLiteOpenHelper { public PersonSQLiteOpenHelper(Context context) {
    super(context, "PERSON.db", null, 1);//此处是super,直接调用父类的构造方法
    } /**
    *
    * 构造方法,用于创建一个辅助类,用于打开/创建/管理一个数据库
    *
    * @param context
    * 上下文
    * @param name
    * 数据库文件的名字
    * @param factory
    * 游标工厂 Cursor 游标(指针), 本身并不存储数据. 保存数据库的引用.
    * @param version
    * 数据库版本
    */
    public PersonSQLiteOpenHelper(Context context, String name,
    CursorFactory factory, int version) {
    super(context, name, factory, version);
    } @Override
    // 数据库第一次被创建时调用,适合初始化操作
    public void onCreate(SQLiteDatabase db) {
    // 创建表
    db.execSQL("create table person ("
    + " _id integer primary key autoincrement, "
    + " name varchar(20), " + " age integer);");
    } @Override
    // 数据库更新时调用这个方法
    // 用于执行表的更新操作
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub } }

    这个类仅仅是一个辅助类,若想使用数据库,还需要创建一个数据库访问类PersonDAO。

  • 2,对数据库进行增删改查

  • public class PersonDAO{
    
        private final Context context;
    private PersonSQLiteOpenHelper helper; public PersonDAO(Context context) {
    this.context = context;
    helper = new PersonSQLiteOpenHelper(context);
    } /**
    * @param name
    * @param age
    */
    public void add(String name, int age) {
    SQLiteDatabase db = helper.getWritableDatabase();
    // db.execSQL("insert into person (name,age) values ('"+name+"',"+age+")");
    // 防止SQL注入
    db.execSQL("insert into person (name,values) values(?,?)",
    new Object[] { name, age });
    } /**
    * 根据名字删除一条数据
    *
    * @param name
    */
    public void delete(String name) {
    SQLiteDatabase db = helper.getWritableDatabase();
    db.execSQL("delete from person where name=?", new Object[] { name });
    } //根据名字更新年龄
    public void update(int age, String name) {
    SQLiteDatabase db = helper.getWritableDatabase();
    db.execSQL("update person set age=? where name=?", new Object[] { age,name });
    } public void querySingleRecord(String nameStr) {
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor cursor = db.rawQuery("select * from person where name=?",new String[] { nameStr }); if (cursor != null && cursor.moveToFirst()) {
    String _id = cursor.getString(0);
    String name = cursor.getString(1);
    String age = cursor.getString(2);
    System.out.println("_id: " + _id);
    System.out.println("name: " + name);
    System.out.println("age: " + age);
    cursor.close();
    }
    } /**
    * 查询所有数据
    */
    public void queryAll() {
    SQLiteDatabase db = helper.getReadableDatabase();
    Cursor cursor = db.rawQuery("select * form person", null); if (cursor != null && cursor.getCount() > 0) {
    while (cursor.moveToNext()) {
    int _id = cursor.getInt(cursor.getColumnIndex("_id"));
    String name = cursor.getString(cursor.getColumnIndex("name"));
    int age = cursor.getInt(cursor.getColumnIndex("age"));
    System.out.println("_id: " + _id);
    System.out.println("name: " + name);
    System.out.println("age: " + age);
    System.out.println("-----------------");
    }
    cursor.close();
    }
    } }
  • 注意:在获得数据库辅助类对象时,此时并未创建数据库,只有在辅助类对象调用getxxxxDatabase方法(创建可读或者可写的数据库)时,才创建数据库。

  • //此时并未创建数据可
    PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
    // 获取一个可读/可写的数据库, 真正创建了数据库
    helper.getWritableDatabase();
     

    3,使用goole的api操作数据库

  • 除了使用SQL语句来进行增删改查,还可以使用google提供的api。

    //主要语句
    // 增
    db.insert("person", "name", values); // 删
    db.delete("person", "name=?", new String[]{name}); // 改
    db.update("person", values, "name=?", new String[]{name}); //查
    Cursor cursor = db.query("person", // 表名
    null, // 要查询列名 new String[]{name,age}
    "name = ?", // 查询条件
    new String[]{nameStr},// 条件参数
    null, // 分组
    null, // 分组
    null); // 排序

    使用google的api对PersonDAO进行修改,如下

    /**
    * 使用google提供的api来操作数据库
    *
    * 数据库访问对象
    * @author wgk
    *
    */
    public class PersonDAO3 { private final Context context;
    private PersonSQLiteOpenHelper helper;
    public PersonDAO3(Context context){
    this.context=context;
    helper=new PersonSQLiteOpenHelper(context);
    }
    /**
    * 增加一条数据
    * @param name
    * @param age
    */
    public void add(String name,int age){
    SQLiteDatabase db=helper.getWritableDatabase();
    ContentValues values=new ContentValues();
    values.put("name", name);
    values.put("age", age); //若需要插入一条空的数据,需要指定任意一个列的名称,以避免异常
    String nullColumnHack="null";
    long insert=db.insert("person", nullColumnHack, values);
    System.out.println(insert);
    }
    /**
    * 删除一条数据根据名字
    * @param name
    */
    public void delete(String name){
    SQLiteDatabase db=helper.getWritableDatabase();
    int delete=db.delete("person", "name=?", new String[]{name});
    System.out.println(delete);
    }
    /**
    * 更新年龄!根据名字
    * @param age
    * @param name
    */
    public void update(int age,String name){
    SQLiteDatabase db=helper.getWritableDatabase();
    ContentValues values=new ContentValues();
    values.put("age", age);
    int update =db.update("person", values, "name=?", new String[]{name});
    System.out.println(update);
    } /**
    * 查!根据一个人的名字
    * @param name
    */
    public void querySingleRecord(String nameStr){
    SQLiteDatabase db=helper.getReadableDatabase();
    Cursor cursor=db.query("person",
    null,//列名
    "name=?",//查询条件
    new String[]{nameStr},//查询参数
    null, //分组
    null,//分组
    null);//排序
    if(cursor!=null&&cursor.moveToFirst()){
    String _id=cursor.getString(0);
    String name=cursor.getString(1);
    String age=cursor.getString(2);
    System.out.println("_id: " + _id);
    System.out.println("name: " + name);
    System.out.println("age: " + age); //关闭cursor
    //关闭cursor
    //关闭cursor
    cursor.close();
    } }
    /**
    * 查询所有数据
    */
    public void queryAll(){
    SQLiteDatabase db=helper.getReadableDatabase();
    Cursor cursor=db.query("person",
    null,
    null,
    null,
    null,
    null,
    "_id DESC");//排序
    if(cursor!=null&&cursor.getCount()>0){
    while(cursor.moveToNext()){
    int _id=cursor.getInt(cursor.getColumnIndex("_id"));
    String name=cursor.getString(cursor.getColumnIndex("name"));
    int age=cursor.getInt(cursor.getColumnIndex("age")); System.out.println("_id: " + _id);
    System.out.println("name: " + name);
    System.out.println("age: " + age);
                  }
    //关闭cursor
    //关闭cursor
    //关闭cursor
    cursor.close();
    }
    }
    }

    两种方式的比较

    1.利用SQL语句进行增删改查
    优点:灵活, 根据需要进行表的级联查询.

    缺点:容易出错. 没有返回值

    2.利用系统API增删改查

    优点:不容易出错. 有返回值

    缺点:不灵活, 效率稍低, 拼接sql语句耗时

    -------------------------------------------------我是分割线-------------------------------------------------

    数据库的事务(Transaction)

    1. (安全性)银行转账:

      • 转出,laowang 账户10000 -> 转出1000 ->
      • 转入,xiaosan 账户 0 收到1000
    2. (高效性)数据的插入:

      • 提高数据库操作效率, 大约提升6倍速度
      • 打开一次数据,

    以laowang给xiaosan转账1000的例子写一段demo如下

    public class TransactionDemo extends AndroidTestCase{
    
        public void transactionDemo(){
    
            PersonSQLiteOpenHelper helper= new PersonSQLiteOpenHelper(getContext());
    //此时才真正创建数据库
    SQLiteDatabase db=helper.getWritableDatabase();
    try{
    //开始事务
    db.beginTransaction(); //转出1000
    db.execSQL("update person set money=money-1000 where name=?", new Object[]{"laowang"}); //在执行至回滚点之前,并不会对数据库进行真的操作,一切都在内存中进行,只有执行到回滚点之后,才会影响到数据库
    //int i =1/0;
    //转入1000
    db.execSQL("update person set money=money+1000 where name=?", new Object[]{"xiaosan"});
    //设置回滚点
    db.setTransactionSuccessful();
    }catch (Exception e){
    e.printStackTrace();
    }finally{
    db.endTransaction(); }
    }

    总结:

    -------------------------------------------------基础要像磐石!!!

android-数据库SQLite相关的更多相关文章

  1. android数据库SQLite的设计模式

    Dao设计模式可能是使用最多的数据库的设计模式其基本思路是将数据库操作的代码 与设计代码分离以便于维护和升级.具体的实现方法是使用包,然后在设计代码中调 用数据库的操作代码,dao设计模式需要创建5个 ...

  2. Android 数据库SQLite 写入SD卡

    如果手机没有root,数据库文件是无法查看到的,不方便调试. 最好的办法是把数据库写进SD卡. 修改的地方有两处: 1.在你的helper类中把数据库文件名称 DATABASE_NAME 由原来的一个 ...

  3. Android数据库(sqlite)加密方案

    最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加 ...

  4. android数据库sqlite增加删改查

    http://hi-beijing.iteye.com/blog/1322040 http://www.cnblogs.com/wenjiang/archive/2013/05/28/3100860. ...

  5. Android下的SQLite数据库的相关操作及AndroidTestCase测试

    一:创建数据库 package com.itcode.mysqlite; import android.content.Context; import android.database.sqlite. ...

  6. Android中SQLite数据库小计

    2016-03-16 Android数据库支持 本文节选并翻译<Enterprise Android - Programing Android Database Applications for ...

  7. Android数据库高手秘籍(一)——SQLite命令

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/38461239 要想熟练地操作不论什么一个数据库.最最主要的要求就是要懂SQL语言, ...

  8. Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

    Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...

  9. Android:自定义Sqlite数据库路径

    默认的sqlite数据库是放在/data/data/database目录下的,今天看腾讯云IM的demo发现再该路径下找不到它存放消息的数据库,找了下后发现居然是放在/data/data/files目 ...

  10. Android数据库(1)、SQLite数据库介绍

    一.关系性数据库   关系型数据库主要有以下三个特征,尤为明显,如果没有这个三个特征约束,当多个客户端使用数据的时候就会出现各种各样的错误,所以关系型数据库定义这些约束,让客户端程序只要遵守这个规则便 ...

随机推荐

  1. 最小生成树的Prim算法

       构造最小生成树的Prim算法    假设G=(V,E)为一连通网,其中V为网中所有顶点的集合,E为网中所有带权边的集合.设置两个新的集合U和T,其中集合U用于存放G的最小生成树的顶点,集合T用于 ...

  2. Hibernate——5.2配置

    Hibernate 5.2才刚刚出来不久,很多资料都并不可靠,终于完成了Hibernate的启动,的确和Hibernate4.x有些不同. 官方文档中的代码代码会报错 如下: 目前在我所知的范围内有两 ...

  3. 集训day15 t1 poj3728

    [问题描述] 有一颗n个节点的树 每个节点上都有许多奸商在卖东西,第i个奸商的理想价格为vi,即他会以vi的价格购买或卖出一件东西 有m个人希望从树上的某个点走到另一个点,问你在只进行一次买卖(每次仅 ...

  4. 【HNOI2008】玩具装箱

    P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1...N的N件玩具,第i件玩具 ...

  5. [P2396] yyy loves Maths VII

    Link: P2396 传送门 Solution: 一眼能看出$O(n*2^n)$的状压$dp$ 但此题是个卡常题,$n=23/24$的时候就别想过了 这题算是提供了一种对状压$dp$的优化思路吧 原 ...

  6. Python中xPath技术和BeautifulSoup的使用

    xpath基本知识 XPath语法:使用路径表达式来选取XML或HTML文档中的节点或节点集 路径表达式 nodename:表示选取此节点的所有子节点 /    : 表示从根节点选取 //   :选择 ...

  7. 编译boost到各个系统平台 mac,iOS,linux,android,wind

    编译boost到各个系统平台 mac,iOS,linux,android,wind git地址:https://github.com/czjone/boost git仓库:https://github ...

  8. [读书笔记]iOS 7 UI设计 对比度

    好久没写随笔了,最近在读<iOS 7 byTutorials>,很不错,推荐给大家. 每一个好的程序员也都是一个设计师,不懂设计的程序员不是好的CTO.哈哈,开个小玩笑. iOS 7设计的 ...

  9. 关于scanf函数的返回值问题

    如: scanf("%d%d",&a,&b); 1.如果a和b都被成功读入,则scanf的返回值为2 2.如果只有a被成功读入,那么返回值为1 3.如果a和b都未被 ...

  10. 自定义PHP页面跳转函数redirect($url, $time = 0, $msg = '')

    利用PHP的header()函数,可以实现页面跳转,如 header("Location: " . $url); 但它有个缺点,一旦HTTP报头块已经发送,就不能使用 header ...