持久化

这只是我在学Android过程中对于所学知识的巩固和方便日后查询的学习笔记,能帮助到有需要的和我一样的初学者就更好了

数据的保存可有文件、SharedPreference、数据库等形式

文件

文件形式类似于最基本的I/O流
Context类提供了openFileOutput(String name,int MODE)方法来获取FileOutputStream对象,此方法有两个参数:
1、文件名 2、储存模式 MODE_APPEND为追加;MODE_PRIVATE为覆盖
借助BufferedWriter对象即可实现写入
同样的也有OpenFileInput(String name)来获取FileInputStream对象
借助BufferedReader即可实现读取

SharedPreferences

使用键值对的形式来保存数据,通过键即可读取值,适合保存一些常用的数据(比如天气软件中可将申请天气所用的各类id在获取时及时保存到SharedPreferences中在启动时直接提取然后自动申请最新数据)

首先获取SharedPreferences对象

有三种方法获取

SharedPreferences pref
=PreferencesManager.getDefaultSharedPreferences(Context context);
=getSharedPreferences(String name ,int MODE); //Context类
=getPreference(int MODE);//Activity类
//后两者可直接传入0,因为目前只有此一中模式可选

然后分为三部实现写入

1、调用SharedPreferences对象的edit()方法获取SharedPreferences.Editor对象editor
2、根据所需数据类型添加数据:
editor.putString(String key,String data);
editor.putBoolean(String key,Boolean data);
3、调用apply()完成数据提交
editor.apply();

Sharedpreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","James");
editor.putInt("age",18);
editor.putBoolean("married",false);
editor.apply();

读取SharedPreferences

1、获取SharedPreferences对象 prefs
2、调用prefs的get方法即可(注意对应值的类型)

SharedPreference prefs
=PraferencesManager.getDefaultSharedPreferences(this);
String name=prefs.getString("name",null)
//参数1为键,参数2为找不到对应值是返回的默认值
int age=prefs.getInt("age",0);
boolean marride=prefs.getBoolean("marride",false);

SQLite

Android自带的轻量级数据库,可使用android的方式也可使用SQL原生语句
使用起来并不复杂

首先

新建MyHelper继承SQLiteDatabaseHelper这个抽象类,并在其中完成建表、初始化等一系列工作

public class MyHelper extends SQLiteDatabaseHelper{
    public static final String CREATE_BOOK="create table Book("
        +"id integer primary key autoincrement,"
        +"author text,"
        +"pages integer,"
        +"price real,"
        +"name text )" 
//SQL建表语句,支持类型integet(int),text(String),real(实数)等等
    private Context mcontext;
    public MyHelper(Context context ,String name ,
                                SQLiteDatabase.CursorFactory factory ,int version){
         super(context ,name ,factory ,version);
          mcontext=context;
    }
    public void onCreate(SQLiteDatabase db){  //创建上边所建的表单
        db.execSQL(CREATE_BOOK);
    }
    public void onUpgrade(SQLiteDatabase db,int oldversion,int newversion){
         //此方法在升级版本是从才会得到执行
    }
}

升级数据库

若想再在次数据库中添加新的表单
要注意创建后onCreate()就不再执行,

其次

使用时
1、获得MyHelper对象,

MyHelper helper=new MyHelper(getContex() ,"library" ,null ,1);
//context对象、数据库名字、null即可、版本号

2、

SQLiteDatabase db=helper.getReadableDatabse();
                                     =helper.getWritableDatabase();
//根据自己的需求选取

数据库升级

若想在已建立的数据库中新加表单的话,在MyHelper中新增表单是无效的,因为建立后onCreate()便不再执行,但是升级版本号onUpgrade()会执行,在此中清除表单再调用onCreate()才行。

public static final String CREATE _MAGEZINE="create table Magezine("
            +"id integer primary key autoincrement,"
            +"name text,"
            +"pages integer,"
            +"price real)"

public onCreate(SQLiteDatabase db){
    db.execSQL("CREATE_BOOK");
    db.execSQL("CREATE_MAGEZINE");
}
public onUpgrade(SQLiteDatabse db ,int oldversion, int newversion){
    db.execSQL("drop table if exists Book");    //删除之前的Book表
    onCreate(db);//重新调用onCreate()
}
helper=new MyHelper(getContext ,"library" ,null ,2);
//版本修改为比之前的大的数就可以使onUpgrade()执行

insert(String tablename ,null ,ContentValues values)

SQLiteDatabase db=myhelper.getWritableDatabase();
ContentValues values=new ContentValues();//数据的载体
values.put("name","十万个为什么");
values.put("pages",525);
values.put("price",98.55);
db.insert("Book" ,null ,values);
values.clear();

query(table ,colunm ,selection ,selectionArgs ,groupBy ,having ,orderBy)
表名、列名、列约束条件、为约束条件赋值、组、包含有、结果的排序方式

SQLiteDatabse db=myhelper.getReadableDatabse();
Cursor cursor=db.query("Book", null,"pages>?",new String[]{500},null,null,null);
//Book表中pages列数值大于500的结果保存在Cursor对象中
if(cursor.moveTofirst()){
    do{
         String name=cursor.getString(cursor.getcolumnIndex(""name));
        }while(cursor.moveToNext());
}
  //cursor的游标在查询结果第一值的前一位moveTofirst为true表示有结果
  //最后一个记过读完后moveToNext()自然是返回false从而停止循环
  cursor.close();

delete(name , 约束)

SQLiteDatabse db=new MyDatabseHelper();
db.delete("Book" ,"pages>?" ,new String[]{"500"});
//删除页数大于500的

update(name ,values ,约束)

SQLiteDatabse db=myhelper.getWritableDatabse();
ContentValues calues=new ContentValues();
values.put("name","十万个冷笑话");
db.update("Book",values,"name=?",new String[]{"十万个为什么"});

注意

1、SQLite的升级过于强硬,drop后表中的数据将全部丢失,所以一定要做好备份;
2、CRUD时一定要做好约束,否则会将虽有的数据都修改了;

开源的LitePal很好用,升级时自动保存之前的数据还能新增表单,很省事

LitePal

首先

添加依赖

compile'org.litepal.android:core:1.4.1'

其次

创建表单的类
LitePal中表就是实体类继承DataSupport类并添加所需属性

public class Book extends DataSupport{
    private int id;//id为必有的
    private String name;
    private int pages;
    private double price;
    private String author;
    GETTER ;SETTER;
}
public class Magezine extends DataSupport{
......
}

再者

配置xml文件
app/src/main→New→Directory→assets
assets→litepal.xml

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="Library"  />         //数据库名
    <version value="1"   />                  //版本
    <list>
        <mapping class="PackageName.Book"/>//表的实体类
        <mapping class="PackageName.Magezine"/>
    </list>
</litepal>

然后

AndroidManifest.xml中<application标签中初始化

android:nane="org.litepal.LitePalApplication"
//为了让litepal获取contex()

最后

使用

Book book=new Book();
book.setName("十万个为什么");
book.setprice(98.55);
book.setpages(525);
book.save();
List<Book> booklist=DataSupport.findAll(Book.class);
//查找Book表中所有元素
Book book=DataSupport.findFirst(Book.class);
//Book表中第一个元素
List<Book> booklist=DataSupport.select("name" ,"author" ,"pages")
                                                      .where("pages>?","500")
                                                      .order("pages")  //desc降序
                                                      .limit(10)             //向后查的量
                                                      .offset(10)           //偏移量
                                                      .find(Bool.class);
/*从表Book中查寻第十个元素到第二十个元素之间页数大于500的元素的name、author、pages三项数据并将结果以pages为基准做升序排列
*/

DataSupport.deleteAll(String tablename ,String seletion ,String seletionArgs)

DataSupport.deleteAll(Book.class ,"pages>?" ,"500");
Book book=new Book();
book.setName("十万个冷笑话");
book.updateAll("name=?and pages>?" ,"十万个为什么" ,"500");
升级

1、新建一个所需表的实体类
2、在assets.xml中的<litepal>的<mapping>中加入
例如<mapping class="PackageName.Student"/>
3、修改assets中version为比之前大的数字即可完成升级,不但创建了新表,之前的表及其数据也都得到了保留

结束

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容