Android基础开发-数据存储

SharedPreferences-xml

共享参数的用法

SharedPreferences是Android的一个轻量级存储工具,采用的存储结构是Key-Value的

键值对方式。

共享参数的存储介质是符合XML规范的配置文件。保存路径是:/data/data/应用包名/shared_prefs/文件名.xml

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

共享参数的使用场景

共享参数主要适用于如下场合:

简单且孤立的数据。若是复杂且相互间有关的数据,则要保存在数据库中。

文本形式的数据。若是二进制数据,则要保存在文件中。

需要持久化存储的数据。在App退出后再次启动时,之前保存的数据仍然有效。

实际开发中,共享参数经常存储的数据有App的个性化配置信息、用户使用App的行为信
息、临时需要保存的片段信息等

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

java 复制代码
//data目录下,创建一个config.xml的文件
        SharedPreferences config = getSharedPreferences("config", Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = config.edit();
        edit.putString("hello","world");
        edit.commit();

        String hello = config.getString("hello","");
XML 复制代码
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="hello">world</string>
</map>

数据库SQLite-*.sql

sQLiteDatabase是SQLiteH0B法有3类:

管理类,用于数据库层面的操作。

openDatabase:打开指定路径的数据库。

isOpen:判断数据库是否已打开。

close:关闭数据库。

getVersion:获取数据库的版本号。

setVersion:设置数据库的版本号。

java 复制代码
        SQLiteDatabase sqLiteDatabase = openOrCreateDatabase(getFilesDir() + "/test.db", Context.MODE_PRIVATE, null);
        String path = sqLiteDatabase.getPath();
        Toast.makeText(this,"path的值=="+path, Toast.LENGTH_SHORT).show();

//        deleteDatabase(getFilesDir() + "/test.db");

数据库管理器SQLiteDatabase

事务类,用于事务层面的操作。

beginTransaction:开始事务。

setTransactionSuccessful:设置事务的成功标志。

endTransaction:结束事务。

数据处理类,用于数据表层面的操作。

execSQL:执行拼接好的SQL控制语句。

delete:删除符合条件的记录。

update:更新符合条件的记录。

insert:插入一条记录。

query:执行查询操作,返回结果集的游标。

rawQuery:执行拼接好的SQL查询语句,返回结果集的游标。

存储卡文件操作

公共区域:

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

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

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

java 复制代码
package com.pshdhx.utils;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileUtil {
    //把字符串保存到指定路径的文本文件
    public static void saveText(String path,String txt){
        BufferedWriter os = null;
        try{
            os = new BufferedWriter(new FileWriter(path));
            os.write(txt);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //从指定路径的文本文件读取字符串
    public static String openTxt(String path){
        StringBuffer sb = new StringBuffer();
        BufferedReader br = null;
        try{
            br = new BufferedReader(new FileReader(path));
            String line = null;
            while ((line = br.readLine()) != null){
                sb.append(line);
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return sb.toString();
    }
}
java 复制代码
 //外部存储的私有空间
        String path1 = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString();
        path1 = path1 + File.separatorChar + "myFileName.txt";
        FileUtil.saveText(path1,"hhhhhh哈哈哈");

        //外部存储的公共空间
        //注册清单文件开启读写权限
        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显示

代码:

java 复制代码
@Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.save_pic:
                String fileName = System.currentTimeMillis()+".jpeg";
                path = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).toString()+ File.pathSeparatorChar+fileName;
                System.out.println("path = " + path);
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dog);
                FileUtil.saveImage(path,bitmap);
                //ToastUtil.showMsg(this,"图片保存成功!");
                System.out.println("图片保存成功!");
                break;
            case R.id.read_pic:
              Bitmap bitmap1 = FileUtil.openImage(path);
                picShow.setImageBitmap(bitmap1);

                Bitmap bitmap2 = BitmapFactory.decodeFile(path);
                picShow.setImageBitmap(bitmap2);

                picShow.setImageURI(Uri.parse(path));
                break;
        }

    }
java 复制代码
  public static void saveImage(String path, Bitmap bitmap) {
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(path);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    public static Bitmap openImage(String path) {
        Bitmap bitmap = null;
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(path);
            bitmap = BitmapFactory.decodeStream(fis);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return bitmap;
    }

Application

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

java 复制代码
package com.pshdhx.middleComponent;

import android.app.Application;
import android.content.res.Configuration;

public class MyApplication extends Application {

    private static MyApplication mApp;
    public static MyApplication getInstance(){
        return mApp;
    }

    //App启动时,调用
    @Override
    public void onCreate() {
        mApp = this;
        super.onCreate();
    }

    //App终止时,调用--不给开发者使用
    @Override
    public void onTerminate() {
        super.onTerminate();
    }

    //在配置改变时,调用。比如说横屏变为竖屏【屏幕旋转时,会重新创建activity】
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }
}

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

主要存取3类数据:

1、用户名、手机号

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

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

利用Room简化数据库操作

实体类:

java 复制代码
@Dao
public interface BookDao {
    @Insert
    void insert(Book... book);

    @Update
    void upd(Book... book);

    @Delete
    void del(Book... book);

    @Query("select * from book")
    List<Book> qry(Book... book);

    @Query("select * from book where name = :name order by  id desc")
    List<Book> qryByName(String name);
}

Application

java 复制代码
 //App启动时,调用
    @Override
    public void onCreate() {
        mApp = this;
        super.onCreate();
        bookDataBase = Room.databaseBuilder(this,BookDataBase.class,"book")
                //允许迁移数据库【如果没有添加,发生数据库变更时,Room默认会删除原数据库再创建新数据库,如此原来的数据会丢失】
                .addMigrations()
                //允许在主线程中操作数据库
                .allowMainThreadQueries()
                .build();

    }



    public BookDataBase getBookDataBase(){
        return bookDataBase;
    }

activity使用:

java 复制代码
bookDao = MyApplication.getInstance().getBookDataBase().bookDao();

@Override
    public void onClick(View v) {
        String inputBookName = bookName.getText().toString();
        String inputBookAuthor = author.getText().toString();
        switch (v.getId()) {
            case R.id.book_add:
                Book b1 = new Book();
                b1.setName(inputBookName);
                b1.setAuthor(inputBookAuthor);
                bookDao.insert(b1);
                break;

        }
    }
java 复制代码
@Database(entities = {Book.class},version = 1,exportSchema = true)
public abstract class BookDataBase extends RoomDatabase {

    public abstract BookDao bookDao();
}

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

相关推荐
- 羊羊不超越 -13 分钟前
App渠道来源追踪方案全面分析(iOS/Android/鸿蒙)
android·ios·harmonyos
wk灬丨1 小时前
Android Kotlin Flow 冷流 热流
android·kotlin·flow
千雅爸爸1 小时前
Android MVVM demo(使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成)
android
晨曦_子画1 小时前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
孤客网络科技工作室2 小时前
AJAX 全面教程:从基础到高级
android·ajax·okhttp
Mr Lee_3 小时前
android 配置鼠标右键快捷对apk进行反编译
android
顾北川_野4 小时前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
&岁月不待人&4 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
Winston Wood6 小时前
Android Parcelable和Serializable的区别与联系
android·序列化
清风徐来辽6 小时前
Android 项目模型配置管理
android