android sqlite 的架构和语法

android  sqlite 大部分时按照三层次架构


简单的如下图:



--com.evidioe.main(主要是存储有关数据库的调用接口和测试,这个目录包可以分解成多个如:网络通信,适配器,数据处理(非android sqlite)等)

--com.evidioe.dao(sqlite dao 存储跟数据库的有关的内容:如数据库的生成,表的生成,表的查询,数据库更新)

--com.evidioe.txt(主要是跟数据库有关的类的存储,当然我喜欢将aidl 层的aidl 文件也放在这里)



作为一个从c++ 做android 的开发人员来说这样的三层次价格貌似很适合界面--业务逻辑---数据处理 三个不同的类似于mvc 架构



回归正题:android sqlite 创建和使用

SQLite简介

Google为Andriod的较大的数据处理提供了SQLite,他在数据存储、管理、维护等各方面都相当出色,功能也非常的强大。SQLite具备下列特点:

 

1.轻量级

使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。

2.独立性

SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。

3.隔离性

SQLite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。

4.跨平台

SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android。

5.多语言接口

SQLite 数据库支持多语言编程接口。

6.安全性

SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据。


Android  sqlite 的使用

首先创建数据库类


public class DatabaseHelper extends SQLiteOpenHelper {
 
    private static final String DB_NAME = "mydata.db"; //数据库名称
    private static final int version = 1; //数据库版本
     
    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, version);
        // TODO Auto-generated constructor stub
    }
 
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "create table user(username varchar(20) not null , password varchar(60) not null );";         
        db.execSQL(sql);
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
 
    }
 
}

这边使用了sqliteOpenHelper 大概官网给出的 资料如下:

SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。

方法名方法描述
SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)构造方法,一般是传递一个要创建的数据库名称那么参数
onCreate(SQLiteDatabase db)创建数据库时调用
onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion)版本更新时调用
getReadableDatabase()创建或打开一个只读数据库
getWritableDatabase()创建或打开一个读写数据库

下面来介绍调用的方法

创建数据库

这里特别的地方是通过调用了SQLiteOpenHelper类的getReadableDatabase()方法来实现创建一个数据库的


1
2
3
DatabaseHelper database = new DatabaseHelper(this);//这段代码放到Activity类中才用this
SQLiteDatabase db = null;
db = database.getReadalbeDatabase();

SQLiteDatabase类为我们提供了很多种方法,而较常用的方法如下

(返回值)方法名方法描述
(int) delete(String table,String whereClause,String[] whereArgs)删除数据行的便捷方法
(long) insert(String table,String nullColumnHack,ContentValues values)添加数据行的便捷方法
(int) update(String table, ContentValues values, String whereClause, String[] whereArgs)更新数据行的便捷方法
(void) execSQL(String sql)执行一个SQL语句,可以是一个select或其他的sql语句
(void) close()关闭数据库
(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)查询指定的数据表返回一个带游标的数据集
(Cursor) rawQuery(String sql, String[] selectionArgs)
运行一个预置的SQL语句,返回带游标的数据集(与上面的语句最大的区别就是防止SQL注入)




其实我们发现数据库的生成很简单只是在我门的内存卡上生成了一个自定义名字的****.db文件,当然我们也可以自己在sd 上创建一个文件(简单java file 操作) 然后往里面放暑假,对于android 系统来说命名为****.db的文件默认就是数据库文件

有了数据库我们就可以往里面填加表,同时进行 增删改查的操作了

当然我们要考虑到俩个问题:

1.资源调用的互斥性:如不能再添加表 数据的时候查询 数据

2.资源调用的可以维护性:我们可以维护数据库中信息


这时候需要一个daoFacitory

public class DAOFactory {
 
 
 private static  DAOFactory instance = null;
 private  boolean mCacheDAOInstances = true;
 
 //public ScoreRankDAO mScoreRankDAO=null;
 
 public SongRateDAO songRateDAO=null;

 public MovieDAO mMovieDAO =null;
  
 public MovieTypeDAO mMovieTypeDAO=null;
 
 public NewSongDAO mNewSongDAO=null;
 
    public  VipDAO mVipDAO=null;
    
    public VipTypeDAO mVipTypeDAO=null;
   
 public SongDAO mSongDAO = null;
 
 public SingerDAO mSingerDAO = null;
 
 public RankDAO mrankDAO=null;


public  static synchronized DAOFactory getInstance() {
          if (instance == null)
          {
              instance = new DAOFactory();
          }
         
          return instance;
      }

利用锁的机制,当调用表操作时候必须要使用db,我们将db 的构造函数加个锁操作,这样可以确保每次使用数据库的操作只有一个

同时对于不同的表我们设定不同的dao操作 在daoFactiory 中设定表的生成函数 如:

  public CffSingerDAO getCffSingerDAO() {
    if (mCacheDAOInstances) {
    if (cffSingerDAO==null) {
     cffSingerDAO=new CffSingerDAO();
    }
    return cffSingerDAO;
   }
   return new CffSingerDAO();
 }

 
通过 dao 和锁的完美配合,我们能保证数据库的调用能够准确高效的运行(架构和语法上的完美结合)


android  sqlite 函数简单调用:

创建表:
db.execSQL("drop table if exists songrate");
        db.execSQL("create table if not exists songrate(" +
              "linecode int16," +
              "id lint16," +
              "rate int16)");


插入数据:

  ContentValues values=new ContentValues();
       values.put("linecode", songRate.getLineCode());
      
       values.put("id",songRate.getSongId());
      
       values.put("rate", songRate.getRate());
       try {
   
        db.insertOrThrow("songrate", null, values);
       
  } catch (Exception e)


查询数据:


cursor=db.query("songrate inner join song on song.id=songrate.id",cursors,selection, null, null,null,"songrate.id asc",limit);


其实 无论是android  调用sqlite 语句execsqlite 还是 android api 封装的阿红is如 insert  query 等,到底层都是转换成 sqlt 语句



最后,注意:


cursor 的遍历非常耗时,所以最好能不遍历的不要用遍历,我这边测试遍历3w 条数据,耗时8秒,当然这跟 机器的性能 和 是否sqlite 优化有关










































评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值