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); }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。