当前位置:   article > 正文

Android基础开发-数据存储

Android基础开发-数据存储

SharedPreferences-xml

共享参数的用法
SharedPreferences是Android的一个轻量级存储工具,采用的存储结构是Key-Value的
键值对方式。
共享参数的存储介质是符合XML规范的配置文件。保存路径是:/data/data/应用包名/shared_prefs/文件名.xml

类似于java中的*.properties的配置文件

共享参数的使用场景
共享参数主要适用于如下场合:
简单且孤立的数据。若是复杂且相互间有关的数据,则要保存在数据库中。
文本形式的数据。若是二进制数据,则要保存在文件中。
需要持久化存储的数据。在App退出后再次启动时,之前保存的数据仍然有效。
实际开发中,共享参数经常存储的数据有App的个性化配置信息、用户使用App的行为信
息、临时需要保存的片段信息等

程序闪退,保存到内存中的信息是没有的。

  1. //data目录下,创建一个config.xml的文件
  2. SharedPreferences config = getSharedPreferences("config", Context.MODE_PRIVATE);
  3. SharedPreferences.Editor edit = config.edit();
  4. edit.putString("hello","world");
  5. edit.commit();
  6. String hello = config.getString("hello","");
  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
  2. <map>
  3. <string name="hello">world</string>
  4. </map>

数据库SQLite-*.sql

sQLiteDatabase是SQLiteH0B法有3类:
管理类,用于数据库层面的操作。
    openDatabase:打开指定路径的数据库。
    isOpen:判断数据库是否已打开。
    close:关闭数据库。
    getVersion:获取数据库的版本号。
    setVersion:设置数据库的版本号。

  1. SQLiteDatabase sqLiteDatabase = openOrCreateDatabase(getFilesDir() + "/test.db", Context.MODE_PRIVATE, null);
  2. String path = sqLiteDatabase.getPath();
  3. Toast.makeText(this,"path的值=="+path, Toast.LENGTH_SHORT).show();
  4. // deleteDatabase(getFilesDir() + "/test.db");

数据库管理器SQLiteDatabase
    事务类,用于事务层面的操作。
        beginTransaction:开始事务。
        setTransactionSuccessful:设置事务的成功标志。
        endTransaction:结束事务。

数据处理类,用于数据表层面的操作。
    execSQL:执行拼接好的SQL控制语句。
    delete:删除符合条件的记录。
    update:更新符合条件的记录。
    insert:插入一条记录。
    query:执行查询操作,返回结果集的游标。
    rawQuery:执行拼接好的SQL查询语句,返回结果集的游标。

存储卡文件操作

公共区域:

        1、所有应用都可以访问的公用区域

        2、仅有A应用访问的私有空间区域

        3、仅有B应用访问的私有空间区域

  1. package com.pshdhx.utils;
  2. import java.io.BufferedReader;
  3. import java.io.BufferedWriter;
  4. import java.io.File;
  5. import java.io.FileReader;
  6. import java.io.FileWriter;
  7. import java.io.IOException;
  8. public class FileUtil {
  9. //把字符串保存到指定路径的文本文件
  10. public static void saveText(String path,String txt){
  11. BufferedWriter os = null;
  12. try{
  13. os = new BufferedWriter(new FileWriter(path));
  14. os.write(txt);
  15. }catch (Exception e){
  16. e.printStackTrace();
  17. }finally {
  18. if(os != null){
  19. try {
  20. os.close();
  21. } catch (IOException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  26. }
  27. //从指定路径的文本文件读取字符串
  28. public static String openTxt(String path){
  29. StringBuffer sb = new StringBuffer();
  30. BufferedReader br = null;
  31. try{
  32. br = new BufferedReader(new FileReader(path));
  33. String line = null;
  34. while ((line = br.readLine()) != null){
  35. sb.append(line);
  36. }
  37. }catch (Exception e){
  38. e.printStackTrace();
  39. }finally {
  40. if(br != null){
  41. try {
  42. br.close();
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }
  48. return sb.toString();
  49. }
  50. }
  1. //外部存储的私有空间
  2. String path1 = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString();
  3. path1 = path1 + File.separatorChar + "myFileName.txt";
  4. FileUtil.saveText(path1,"hhhhhh哈哈哈");
  5. //外部存储的公共空间
  6. //注册清单文件开启读写权限
  7. String s = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
android:requestLegacyExternalStorage="true"

storage和SD卡的目录,其实就是一个映射。

 在存储卡上读取图片

将图片缓存到缓存里,不用每次读取图片都要从网络中获取。

Android 的位图工具是Bitmap,App读写Bitmap可以使用性能更好的

BufferedOutputStream和BufferedInputStream。
Android还提供了BitmapFactory工具用于读取各种来源的图片,相关方法如下:
decodeResource:该方法可从资源文件中读取图片信息。
decodeFile:该方法可将指定路径的图片读取到Bitmap对象。

decodeStream:该方法从输入流中读取位图数据。

实现效果:

将图片读取到外部存储里边保存,然后从保存的位置再读取到ImageView显示

代码:

  1. @Override
  2. public void onClick(View v) {
  3. switch (v.getId()){
  4. case R.id.save_pic:
  5. String fileName = System.currentTimeMillis()+".jpeg";
  6. path = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString()+ File.pathSeparatorChar+fileName;
  7. System.out.println("path = " + path);
  8. Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog);
  9. FileUtil.saveImage(path,bitmap);
  10. //ToastUtil.showMsg(this,"图片保存成功!");
  11. System.out.println("图片保存成功!");
  12. break;
  13. case R.id.read_pic:
  14. Bitmap bitmap1 = FileUtil.openImage(path);
  15. picShow.setImageBitmap(bitmap1);
  16. Bitmap bitmap2 = BitmapFactory.decodeFile(path);
  17. picShow.setImageBitmap(bitmap2);
  18. picShow.setImageURI(Uri.parse(path));
  19. break;
  20. }
  21. }
  1. public static void saveImage(String path, Bitmap bitmap) {
  2. FileOutputStream fos = null;
  3. try {
  4. fos = new FileOutputStream(path);
  5. bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
  6. } catch (Exception e) {
  7. e.printStackTrace();
  8. } finally {
  9. if (fos != null) {
  10. try {
  11. fos.close();
  12. } catch (IOException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  17. }
  18. public static Bitmap openImage(String path) {
  19. Bitmap bitmap = null;
  20. FileInputStream fis = null;
  21. try {
  22. fis = new FileInputStream(path);
  23. bitmap = BitmapFactory.decodeStream(fis);
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. } finally {
  27. if (fis != null) {
  28. try {
  29. fis.close();
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }
  35. return bitmap;
  36. }

Application

Application是android的一大组件,在App运行过程中有且仅有一个Application对象贯彻整个生命周期。

  1. package com.pshdhx.middleComponent;
  2. import android.app.Application;
  3. import android.content.res.Configuration;
  4. public class MyApplication extends Application {
  5. private static MyApplication mApp;
  6. public static MyApplication getInstance(){
  7. return mApp;
  8. }
  9. //App启动时,调用
  10. @Override
  11. public void onCreate() {
  12. mApp = this;
  13. super.onCreate();
  14. }
  15. //App终止时,调用--不给开发者使用
  16. @Override
  17. public void onTerminate() {
  18. super.onTerminate();
  19. }
  20. //在配置改变时,调用。比如说横屏变为竖屏【屏幕旋转时,会重新创建activity】
  21. @Override
  22. public void onConfigurationChanged(Configuration newConfig) {
  23. super.onConfigurationChanged(newConfig);
  24. }
  25. }

接着下activity中,就可以使用application类中的map对象了,供所有的activity使用。

主要存取3类数据:

1、用户名、手机号

2、不方便由意图传递的数据。例如位图对象、非字符串类型的集合对象。

3、容易因频繁分配内存到导致内存泄露的对象,如Handler对象等。

利用Room简化数据库操作

实体类:

  1. @Dao
  2. public interface BookDao {
  3. @Insert
  4. void insert(Book... book);
  5. @Update
  6. void upd(Book... book);
  7. @Delete
  8. void del(Book... book);
  9. @Query("select * from book")
  10. List<Book> qry(Book... book);
  11. @Query("select * from book where name = :name order by id desc")
  12. List<Book> qryByName(String name);
  13. }

Application

  1. //App启动时,调用
  2. @Override
  3. public void onCreate() {
  4. mApp = this;
  5. super.onCreate();
  6. bookDataBase = Room.databaseBuilder(this,BookDataBase.class,"book")
  7. //允许迁移数据库【如果没有添加,发生数据库变更时,Room默认会删除原数据库再创建新数据库,如此原来的数据会丢失】
  8. .addMigrations()
  9. //允许在主线程中操作数据库
  10. .allowMainThreadQueries()
  11. .build();
  12. }
  13. public BookDataBase getBookDataBase(){
  14. return bookDataBase;
  15. }

activity使用:

  1. bookDao = MyApplication.getInstance().getBookDataBase().bookDao();
  2. @Override
  3. public void onClick(View v) {
  4. String inputBookName = bookName.getText().toString();
  5. String inputBookAuthor = author.getText().toString();
  6. switch (v.getId()) {
  7. case R.id.book_add:
  8. Book b1 = new Book();
  9. b1.setName(inputBookName);
  10. b1.setAuthor(inputBookAuthor);
  11. bookDao.insert(b1);
  12. break;
  13. }
  14. }

 

  1. @Database(entities = {Book.class},version = 1,exportSchema = true)
  2. public abstract class BookDataBase extends RoomDatabase {
  3. public abstract BookDao bookDao();
  4. }

android常用框架组件

1、Jetpack

        MVC MVP MVVM

        androidx

        Jetpack组成

2、LifeCycle

        LifeCycle解耦页面和组件

        LifeCycleService解耦service和组件

        ProcessLifecycleOwner监听程序与生命周期

3、ViewModel

        作用与应用

        生命周期特性

        AndroidViewModel

4、LiveData

        应用与优势

        ViewModel+liveData实现Fragment间通信

5、DataBinding

        DataBinding意义与应用、ActivityMainBinding的由来

        二级页面的绑定

        自定义BindingAdapter加载网络图片与参数可选

        双向绑定BaseOvservable与ObservableField

        RecyclerView的绑定

        DataBinding+ViewModel+LivaData整合

6、MVVM架构设计

        MVVM架构与Jetpack

        数据模型驱动界面更新

        使用Jetpack组件构建MVVM应用程序

7、Room

        Android官方的ORM库

        Room+ViewModel+LiveData

        使用Migration升级数据库

        异常处理

        Schema文件记录排查问题

        销毁和重建策略

        欲填充数据库

8、Navigation

9、WorkManager

10、Paging

11、Compose

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/153109
推荐阅读
相关标签
  

闽ICP备14008679号