Android数据存储

1.SharedPreferences存储

前面的文件存储用处不太大,有兴趣的可以自学一下。
SharedPreferences存储是一种存储方式,通过键值对的方式(大概可以理解为布局文件里面的id)来存储数据。也就是说在你存的时候要提供对应的键,取得时候就能通过这个键把对应得值取出来。
并且其支持多种不同数据类型的存储,存进去是整型,取出来也是整型。以此类推。

存个数据

我们打开as,新建一个SharePreferencesTest项目,然后修改activity_main.xml的代码,如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

<Button
    android:id="@+id/save_data"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Save data">

</Button>

我们将布局设置为了LinearLayout,并添加了一个Button按钮
然后修改MainActivity的代码,如下

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button saveData=findViewById(R.id.save_data);
        saveData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
                editor.putString("name","Tom");
                editor.putInt("age",28);
                editor.putBoolean("married",false);
                editor.apply();
            }
        });

我们来一一解析一下
Button saveData=findViewById(R.id.save_data); //创建了一个Button对象,并将其与布局中的按钮控件绑定了起来

saveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) //注册监听器,点击按钮时就会触发里面的onClick方法

SharedPreferences.Editor editor=getSharedPreferences(“data”,MODE_PRIVATE).edit(); //得到 SharedPreferences.Editor 实例(editor),getSharedPreferences()里面的第一个参数是将其文件名称指定为data(数据就存入这个文件里面),第二个则用于指定操作模式,MODE_PRIVATE表示只有当前的程序可以对这个文件进行读写

editor.putString(“name”,“Tom”);
editor.putInt(“age”,28);
editor.putBoolean(“married”,false); //非常简单,我们通过editor对象调用一系列put方法就可以将数据写入文件了,方法里面的参数第一个为键值,第二个为你要存进去的东西。

然后,通过apply()方法提交。
当你点击这个button按钮时,数据就写进去啦!

取个数据

我们在activity_main.xml里面再加个按钮,用于我们来取数据,如下

 <Button
        android:id="@+id/restore_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Restore data">
    </Button>

然后将MainActivity里面添加如下代码

 Button restoreData=findViewById(R.id.restore_data);
 restoreData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferences pref=getSharedPreferences("data",MODE_PRIVATE);
                String name=pref.getString("name","");
                int age=pref.getInt("age",0);
                boolean married=pref.getBoolean("married",false);
                Log.d("MainActivity","name is"+name);
            }
        });

同样的,我们先得到一个SharedPreferences实例(pref),然后通过这个对象调用一系列get方法就可以取出来了。
get方法里面传入两个参数,第一个为我们存进去时所设置的键,第二个则是如果找不到这个键,那么以这个默认值返回。

2.LitePal数据库存储

安卓之所以如此的受欢迎,不仅在于面向用户的一系列产品,面向我们开发者同样也非常友好。
GitHub上拥有成百上千的优秀Android开源项目,这使得很多时候我们开发时不用自己去编写那些冗长的代码,处理那些复杂的逻辑。调用一下几分钟就搞定,甚至比复制粘贴还容易。
那么我们一起来看一下这个开源库——LitePal,它的地址为https://github.com/LitePalFramework/LitePal

配置LitePal

我们找到app/build.gradle文件,然后在dependencies闭包中添加如下代码:

    implementation 'org.litepal.android:java:3.0.0'

最后的3.0.0是版本号,这是目前最新的版本。
然后我们再直接在app文件夹下(使用Project文件管理模式的见第一行代码)新建一个名为assets的Directory,然后新建一个litepal.xml文件,编辑内容如下

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="BookStore"> </dbname>
    <version value="1"> </version>
    <list>
    </list>
</litepal>

dbname标签用于指定数据库名,version标签用于指定数据库版本号,list标签则用于指定所有的映射模型。
接着,我们再修改一下AndroidManifest.xml中的代码,在<application下添加如下代码:

 <application
        android:name="org.litepal.LitePalApplication"  //添加这一行代码

ok,配置完成

创建数据库

定义一个Book类,代码如下
(自动生成get和set方法为:定义好变量,同时按下Alt与Insert,然后在弹出的框内选中Getter and Setter,按下shift键选中全部,最后点击ok)

public class Book {
    private int id;
    private String author;
    private double price;
    private int pages;
    private String name;

    public int getPages() {
        return pages;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

通过这个类,就相当于我们创建好了一个表。类中的每一个都分别对应了表中的一个列。
接下来我们将Book类添加到映射模型当中,打开litepal.xml,修改代码如下

<?xml version="1.0" encoding="utf-8"?>
<litepal>
    <dbname value="BookStore"> </dbname>
    <version value="1"> </version>
    <list>
        <mapping class="com.example.litepaltest.Book"></mapping>
    </list>
</litepal>

在list标签下,我们通过<mapping标签声明我们要配置的映射模型类。

接着,我们在activity_main.xml下添加一个按钮方便我们建表,添加如下代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/creat_Litpal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="creat">

    </Button>

</LinearLayout>

最后,在MainActivity下添加如下代码

        Button creatLiptal=findViewById(R.id.creat_Litpal);
        creatLiptal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LitePal.getDatabase();
            }
        });

额,简单到无以复加。我们只需要通过LitePal.getDatabase()就可以建好表了。
如何查看这张表详见第一行代码。

添加数据

修改Book类,使其继承LitePalSupport(注意,新版本和第一行代码中不一样),如下

public class Book extends LitePalSupport {
	.........
	}

然后,我们设置一个Button按钮方便我们添加数据,如下

    <Button
        android:id="@+id/add_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="add">

    </Button>

嗯,在主函数里添加如下代码

 Button addData=findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book=new Book();
                book.setName("高等数学");
                book.setAuthor("同济大学");
                book.setPages(337);
                book.setPrice(39.00);
                book.save();
            }
        });

创建一个Book类实例,然后通过这个调用一系列set方法我们就可以对数据库内的数据设置,再通过sava()方法提交。

注意

细心的同学可以发现,我们在book类还中设置了一个id没有赋值。
实质上,这个id代表你插入的对应行,当调用save()方法或saveThrows()方法存储成功之后,LitePal会自动将该条数据对应的id赋值到实体类的id字段上。
举个栗子

News news = new News();
news.setTitle("这是一条新闻标题");
news.setContent("这是一条新闻内容");
news.setPublishDate(new Date());
Log.d("TAG", "news id is " + news.getId());
news.save();
Log.d("TAG", "news id is " + news.getId());

我们新建了一个News表格,没有对其id赋值,观察打印结果
在这里插入图片描述
OK,在save之前打印的id是0,说明此时id这个字段还没有被赋值,在save之后打印的id是1,说明此时id已经被赋值了。那么我们再到数据库表中再查看一下这条记录到底有没有存储成功吧,如下图所示:

在这里插入图片描述
所以说,数据库中的每一列通过你创建的类来定义,每一行则通过id值来辨别。当调用save()方法或saveThrows()方法存储成功之后,LitePal会自动将该条数据对应的id赋值到实体类的id字段上。

更新数据

同样的,设置一个Button按钮

    <Button
        android:id="@+id/update_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="updata">

    </Button>

代码代码

Button updateData=findViewById(R.id.update_data);
        updateDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book=new Book();
                book.setName("高等数学");
                book.setAuthor("同济大学");
                book.setPages(337);
                book.setPrice(39.00);
                book.save();
                book.setPrice(1);
                book.save();
            }
        });

什么意思呢,在你save()提交了一次之后,如果还用book这个对象去赋值,LitePal会发现这个对象是已经存储的,因此不会再去新添加一行,而是在原先那一行下更新数据,id值不会变。
我们可以感觉到,这样更新限制太大了,因此我们有更简便的方法,代码如下

Button updateData=findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Book book=new Book();
                book.setPrice(1);
                book.updateAll("name=? and author=?","高等数学","同济大学");
            }
        });

我们先通过set方法来更新我们想要修改的数据,然后通过updateAll()方法执行更新操作。这里我们指定所有"name"为"高等数学"并且"author"为"同济大学"的书书价更新为1.如果不指定的话,则会更新所有数据。

删除和查询数据

和前面的大同小异,大家自学一下。。
这里推荐一下郭霖大神的博客
Android数据库高手秘籍(零)——前言
http://blog.csdn.net/guolin_blog/article/details/38083103
Android数据库高手秘籍(一)——SQLite命令
http://blog.csdn.net/guolin_blog/article/details/38461239
Android数据库高手秘籍(二)——创建表和LitePal的基本用法
http://blog.csdn.net/guolin_blog/article/details/38556989
Android数据库高手秘籍(三)——使用LitePal升级表
http://blog.csdn.net/guolin_blog/article/details/39151617
Android数据库高手秘籍(四)——使用LitePal建立表关联
http://blog.csdn.net/guolin_blog/article/details/39207945
Android数据库高手秘籍(五)——LitePal的存储操作
http://blog.csdn.net/guolin_blog/article/details/39345833
Android数据库高手秘籍(六)——LitePal的修改和删除操作
http://blog.csdn.net/guolin_blog/article/details/40083685
Android数据库高手秘籍(七)——体验LitePal的查询艺术
http://blog.csdn.net/guolin_blog/article/details/40153833
Android数据库高手秘籍(八)——使用LitePal的聚合函数
http://blog.csdn.net/guolin_blog/article/details/40614197

下面是迭代的版本:

2016-03-03 郭霖

LitePal 1.3.1发布了,从此支持图片存储!
http://mp.weixin.qq.com/s/7tDifDvOHr7YI7zCS9fpmQ

2016-11-15 郭霖

你们要的多数据库功能终于来了
http://mp.weixin.qq.com/s/C7nbJXOS9lYPgOda-8Pw0A

2017-03-07 郭霖

LitePal 1.5.0版本发布,你想要的都在这里
http://mp.weixin.qq.com/s/GXPkrkiHk4MWNnpCLzTf_Q

2017-08-15

LitePal 1.6.0版本来袭,数据加解密功能保障你的应用数据安全
https://mp.weixin.qq.com/s/TSp36cnKLxUmAHjT86UCrQ

2018-06-11

Android数据库高手秘籍(九),赶快使用LitePal 2.0版本吧
https://blog.csdn.net/guolin_blog/article/details/80586028

课后实践

1.把p208页6.33的“记住密码实现功能”敲一遍
2.学习p240-243的删除和查询功能,将代码实现一遍。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值