android-数据持久化存储2

1.SQLite

   android内置SQLite数据库,它是一个轻量级的嵌入式数据库,在默认情况下每个应用所创建

   的数据库都是私有的,其名字是唯一的,各个应用无法访问对方的数据库。各个应用生成的

   数据库存储在“/data/data/<包名>/database/”目录下。

2.DAO设计应用

  将底层数据库存储逻辑与上层业务逻辑分离。当底层存储的数据对象发生改变时,只要修改实现DAO接口的代码即可,而上层业务层代码不用进行任何的改动。

  组成部分:

        1.数据存储对象

        2.DAO接口(实现增删改查的操作)

        3.连接数据库的接口

        4.实现DAO接口的具体类

        5.DAO的Factory类。

2.1 SQLiteOpenHelper(抽象类:用来连接数据库)

   用来创建或打开数据库,该类提供了获取获取相应数据库的方法。

   构造方法:

    SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version);

   //只是创建一个SQLiteOpenHelper对象,还没有创建或打开相应的数据库。

   成员方法:

    synchronized SQLiteDatabase getReadableDatabase();//打开或创建一个数据库对象,只能进行读操作。

    synchronized SQLiteDatabase getWritableDatabase();//打开或创建一个数据库对象,只能进行写操作。

    void onOpen(SQLiteDatabase db);//打开数据库时的回调函数。 

   继承该类必须实现的方法:

   void onCreate(SQLiteDatabase db);//在数据库创建时被调用

   void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);//在数据库升级时被调用

 2.1a 创建触发器

      android提供了SQLite数据库的触发器(Trigger)机制,它是一种特殊的数据操作过程,在对指定的数据表执行指定的修改语句时,

      特定的数据操作将被执行。比如当你删除某个作者记录时,则可以用Trigger删除作者相应的书籍记录。触发器一般在SQLiteOpenHelper类

      里的oncreate方法中定义。

    public void onCreate(SQLiteDatabase db) {
         
        // 创建触发器,删除AUTHOR中记录的时候,级联删除BOOK中关联的记录
        //create trigger book_delete delete on author(表) 
        //begin delete from book(表) where author_id=old._id end ;
        db.execSQL("CREATE TRIGGER book_delete DELETE ON "
                         + Publisher.AUTHOR_TABLE + " " + "BEGIN " + "DELETE FROM "
                         + Publisher.BOOK_TABLE + " WHERE " + Publisher.BOOK.AUTHOR_ID
                         + "=old._id;" + "END;");
                 // 创建索引,"create index authorname_index on author(表) (author_name,author_sex,等等的字段 )"
                 //可以在列名称后面添加降序或升序排列"desc","asc"如:(author_name desc )。
                 db.execSQL("CREATE INDEX authorname_index ON " + Publisher.AUTHOR_TABLE
                         + " (" + Publisher.AUTHOR.NAME + ");");

   2.1b 创建索引

       索引是对数据表中一列或多列的值进行排序的一种结构,使用索引可以更快的查找数据,而

       不用读取整张表。但是更新一个有索引的表的时间比更新没有索引表的时间更长。所以索引

       仅被用于经常被检索的列上。

public void onCreate(SQLiteDatabase db) { 

  // 创建索引,"create index authorname_index on author(表)  (author_name,author_sex,等等的字段 )"
  //可以在列名称后面添加降序或升序排列"desc","asc"如:(author_name desc )。
      db.execSQL("CREATE INDEX authorname_index ON " +          
       Publisher.AUTHOR_TABLE
                + " (" + Publisher.AUTHOR.NAME + ");");
}

     2.1c 创建视图

       视图(View)用来表示一个或多个表中的记录,可以在数据库中生成虚拟表。SQLite是关系型

       数据库。在oncreate方法里

// 创建视图,方便BOOK和AUTHOR表联查
//"create view if not exists book_author(表) as select book.* (表),author_name(列名)
//  from  book(表) left outer join author(表) on author._id(表下的列名)=book.author_id;(表下的列名) "
//"book.*"该表下的所有列,"left outer join"左外连接操作,表示最终生成的虚拟表行
//包括左表(BOOK_TABLE)和右表(AUTHOR_TABLE)满足特定条件的行。该条件时"on"后面的语句,
//author._id的值必须等于book.author_id的值,即book下的author_id指向了author的_id。
db.execSQL("CREATE VIEW IF NOT EXISTS " + Publisher.BOOK_AUTHOR_TABLE
        + " AS " + "SELECT " + Publisher.BOOK_TABLE + ".*" + ", "
        + Publisher.AUTHOR.NAME + " FROM " + Publisher.BOOK_TABLE
        + " LEFT OUTER JOIN " + Publisher.AUTHOR_TABLE + " ON "
        + Publisher.AUTHOR_TABLE + "." + Publisher.AUTHOR._ID + "="
        + Publisher.BOOK_TABLE + "." + Publisher.BOOK.AUTHOR_ID);

      ”adb shell “下进入/data/data/<包名>/databases/用”sqlite3 数据库名“进入数据库。

      使用”PRAGMA table_info (book_author)“查看book_author表。

   2.2 数据存储对象(VO:值对象)

     需要自己创建一个新类,包含了相应的表字段。

//定义VO(存储数据对象)
public final class Publisher {

    //有两种表,一张作者,一张书籍
    //表名
    public static final String BOOK_TABLE="book";
    public static final String AUTHOR_TABLE="author";
    //虚拟表(视图)用一张表表示多张表的内容

    public static final String BOOK_AUTHOR_TABLE = "book_author";
    //author表结构,BaseColumns接口中有两个字段 _ID="_id",_COUNT="_count"
    public static class AUTHOR implements BaseColumns
    {
        public static final String NAME="author_name";
        public static final String AGE="age";
        public static final String SEX="sex";
        public static final String ORDER_BY="author_name desc ";
     
    }
    
    public static class BOOK implements BaseColumns
    {
        public static final String NAME="book_name";
        public static final String YEAR="year";
        public static final String ORDER_BY="book_name desc ";
        public static final String AUTHOR_ID="author_id";
    }
}

   2.3 DAO接口

       提供了上层应用使用的数据操作方法

public interface PubliserDao {

    Cursor getAuthors();

    Cursor getAuthorById(long id);

    Cursor getBooksByAuthor(long author_id);

    Cursor getBookById(long id);

    void insertAuthor(String name, String address, String phone);

    void updateAuthor(long id, String name, String address, String phone);

    void insertBook(long author_id, String name, String year);

    void updateBook(long id, String name, String year);

    void deleteAuthor(long author_id);

    void deleteAuthors(String where);
}

 

posted @ 2015-03-15 23:41  beyondbycyx  阅读(166)  评论(0编辑  收藏  举报