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);
}
时间: 2024-08-06 03:44:59

android-数据持久化存储2的相关文章

Android数据持久化存储

Android数据持久化存储共有四种方式,分别是文件存储.SharedPreferences.Sqlite数据库和ContentProvider.在本篇幅中只介绍前面三种存储方式,因为ContentProvider属于android四大组件之一,所以它的数据存储方式在介绍四大组件的时候说明. 1.文件存储 文件存储不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据. 文件存储有两种方式,一是存储到手机内存中(memor

饿了么开源项目:便捷高效的Android数据持久化存储框架

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51436972 Android应用开发时经常要对许多数据进行持久化存储,便于以后访问. 对于int.double.boolean这些基本数据,可以使用SharedPreference.对于一些对象,往SharedPreference里存储的时候需要使用序列化技术.如果对象很大,或者碰到列表.数组等结构,就必须使用数据库.而使用数据库比较麻烦,成

数据持久化存储

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 沙盒 在介绍各种存储方法之前,有必要说明以下沙盒机制.iOS程序默认情况下只能访问程序自己的目录,这个目录被称为“沙盒”. 1.结构 既然沙盒就是一个文件夹,那就看看里面有什么吧.沙盒的目

iOS数据持久化存储

本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如"是否第一次打开"的BOOL值,大到游戏的进度和状态等数据,都需要进行本地持久化存储.这些数据的存储本质上就是写磁盘存文件,原始一点可以用iOS本身支持有NSFileManager这样的API,或者干脆C语言fwrite/fread,Cocoa Touch本身

Swift - 使用Core Data进行数据持久化存储

一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象. 2,虽然其底层也是由类似于SQL的技术来实现,但我们不需要编写任何SQL语句,有点像Java开发中的Hibernate持久化框架 3,Core Data数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型. 4,与SQLite区别:只能取出整个实体记录,然后分解,

iOS开发之数据持久化存储

概论 数据持久化存储:所谓持久化存储就是将数据保存到硬盘中,使得应用程序或者机器在重启后可以访问之前保存的数据. 常见方式: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite3(数据库) CoreData(苹果基于数据库封装的持久化存储工具,这种方式效率不高,因为会帮我们动态生成很多重复的代码,我只有写XMPP的时候会用一下,因为XMPP里面的存储用的就是CoreData) 沙盒 说到持久化存储就不得不说一下苹果的沙盒机制,苹果的

redis的数据持久化存储

redis的数据持久化存储 Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘来保证持久化.Redis支持两种持久化方式: 一.snapshotting(快照)方式快照是默认的持久化方式.这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb.我们可以配置redis在n秒内如果超过若干个key被修改就自动做快照持久保存. 在约87行,有默认的快照策略(指定在多长时间内,有多少次更新操作,就将数据同步到数据快照文件,可以多个条件

[Xcode10 实际操作]七、文件与数据-(14)数据持久化存储框架CoreData的使用:删除CoreData中的数据

本文将演示如何删除数据持久化对象. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 //引入数据持久化存储框架[CoreData] 3 import CoreData 4 5 class ViewController: UIViewController { 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup a

python 基础之数据持久化存储

###数据持久化存储 - 说明:持久化存储方案,普通文件.数据库.序列化 - 示例: ```python import pickle class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return 'name:{} age:{}'.format(self.name, self.age) xiaoming = Person('xiaoming', 20) #

Android开发之数据持久化存储二

一.目标 以QQ登陆为例,继续完成昨天没有完成的任务,实现数据的存储和回显读取,并且学会往SD卡内存储信息 二.源程序代码 package com.example.qq_logindemo; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.Vie