【第一行代码学习笔记】数据持久化存储

数据持久化存储

三大存储方式:文件存储,SharedPreference存储,数据库存储

文件存储

1.将数据存储到文件中

​ Context类提供了openFileOutput()方法,可用于将数据存储到指定文件中

public class MainActivity extends AppCompatActivity {

    private EditText mEdit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEdit = this.findViewById(R.id.edit);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        String input = mEdit.getText().toString().trim();
        save(input);//销毁之前保存数据
    }

    /**
     * 将数据存储到文件中
     * @param input
     */
    private void save(String input) {
        FileOutputStream out = null;//文件输出流,用于将数据写入File或FileDescriptor的输出流
        BufferedWriter writer = null;//字符缓冲流
        try {
            out = openFileOutput("data", Context.MODE_PRIVATE);
            //第一个参数是文件名,不可以包含路径,默认存储到/data/data/<package name>/files/目录下
            //第二个参数是文件操作模式:Context.MODE_PRIVATE每次覆盖原文件; MODE_APPEND每次追加到原文件内容后面
            //返回一个FileOutputStream对象
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(input);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
2.从文件中读取数据

​ Context类提供了openFileInput()方法,可用于将数据存储到指定文件中

public class MainActivity extends AppCompatActivity {

    private EditText mEdit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mEdit = this.findViewById(R.id.edit);

        String content = load();
        if (!TextUtils.isEmpty(content)) {//TextUtils.isEmpty(content)即content==null||content.length==0
            mEdit.setText(content);
            mEdit.setSelection(content.length());//将光标移至内容尾部以便继续输入
            Toast.makeText(this, "Restoring succeeded.", Toast.LENGTH_SHORT).show();

        }
    }

    /**
     * 从文件中读取数据
     * @return
     */
    private String load() {
        FileInputStream input = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try {
            input = openFileInput("data");//一个参数:文件名
            reader = new BufferedReader(new InputStreamReader(input));
            String line = "";
            while ((line = reader.readLine())!=null){
                content.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return content.toString();
    }
}

SharedPreferences存储

​ SharedPreferences使用键值对的方式来存储的

1.将数据存储到SharedPreferences文件中

1)Context类中的getSharedPreferences()方法

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button saveData = this.findViewById(R.id.save_data);
        Button restoreData = this.findViewById(R.id.restore_data);

        //保存数据
        saveData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
                //getSharedPreferences第一个参数是文件名,第二个参数是文件模式,只有MODE_PRIVATE,表示至于当前程序才可以对这个文件进行读写
                editor.putString("name", "yxq");
                editor.putInt("age", 23);
                editor.putBoolean("married", false);
                editor.apply();//提交数据
            }
        });

        //读取数据
        restoreData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
                String name = pref.getString("name", null);
                int age = pref.getInt("age", 0);
                boolean married = pref.getBoolean("married", false);
                Log.d(TAG, "name --> " + name + ", age --> " + age + ", married --> " + married);
            }
        });
    }
}

2)Activity类中的getPreferences()方法

只接收一个操作模式参数,使用这个方法会自动将当前活动的类名作为SharedPreferences的文件名

3)PreferenceManager类中的getDefaultSharedPreferences()方法

这是一个静态方法,只接受Context参数,自动将当前应用程序的包名作为前缀来命名SharedPreferences文件

SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
//写数据
SharedPreferences.Editor editor = pref.edit();
editor.putString("account", account);
editor.putString("password", password);
editor.putBoolean("remember", true);
editor.apply();

//读数据
String account = pref.getString("account", ""));
int age = pref.getInt("age", 0);
boolean married = pref.getBoolean("married", false);
2.从SharedPreferences 中读数据
SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
String name = pref.getString("name", null);
int age = pref.getInt("age", 0);
boolean married = pref.getBoolean("married", false);

SQLite数据库存储

使用LitePal操作数据库

LitePal采取的是对象映射关系ORM模式,我们使用的编程语言是面向对象语言,使用的数据库是关系型数据库,那么面向对象的语言和面向关系的数据库之间建立一种映像关系就是对象关系映射。

准备

github.com/guolindev/LitePal

www.ngui.cc/article/show-330979

创建数据库

1.创建模型类

2.添加到litepal.xml中(app/src/main->new->directory->assets->litepal.xml)

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

标签就是用于声明我们要配置的映射模型类,一定要使用完整的类名。

3.Connector.getDatabase();//创建数据库

升级数据库

1.新建表:直接新建一个模型类,然后加到litepal.xml中

2.新增列:直接修改模型类

记得修改版本号,Litepal会自动保留之前表中的数据

CRUD操作

CRUD操作中的模型类必须继承自LitePalSupport

book.save();//添加数据
//方式一
Book book = createBook();
book.save();//添加数据
book.setPrice(7.7);//上面的数据被修改
book.save();
//方式二
Book book = new Book();
book.setPrice(14.95);
book.setAuthor("wt");
book.updateAll("pages = ? and price = ?", "100", "7.7");//更新数据
book.setToDefault("name");//把某个字段的值更新成默认值
LitePal.deleteAll(Book.class, "price = ?", "14.95");//条件删除
List<Book> books = LitePal.findAll(Book.class);//查询数据
Book firstBook = LitePal.findFirst(Book.class);
Book lastBook = LitePal.findLast(Book.class);
List<Book> selectBook = LitePal.select("name", "author").find(Book.class);
List<Book> whereBook = LitePal.where("pages > 100").find(Book.class);
List<Book> orderBook = LitePal.order("pages desc").find(Book.class);
List<Book> limitBook = LitePal.limit(3).find(Book.class);//查询前三条
List<Book> offsetBook = LitePal.limit(3).offset(1).find(Book.class);//查询2,3,4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值