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

相关推荐
_小马快跑_10 分钟前
ConstraintLayout之layout_constraintDimensionRatio属性详解
android
百锦再1 小时前
Android Studio开发 SharedPreferences 详解
android·ide·android studio
青春给了狗2 小时前
Android 14 修改侧滑手势动画效果
android
CYRUS STUDIO2 小时前
Android APP 热修复原理
android·app·frida·hotfix·热修复
火柴就是我3 小时前
首次使用Android Studio时,http proxy,gradle问题解决
android
limingade3 小时前
手机打电话时电脑坐席同时收听对方说话并插入IVR预录声音片段
android·智能手机·电脑·蓝牙电话·电脑打电话
浩浩测试一下3 小时前
计算机网络中的DHCP是什么呀? 详情解答
android·网络·计算机网络·安全·web安全·网络安全·安全架构
青春给了狗5 小时前
Android 14 系统统一修改app启动时图标大小和圆角
android
pengyu5 小时前
【Flutter 状态管理 - 柒】 | InheritedWidget:藏在组件树里的"魔法"✨
android·flutter·dart
居然是阿宋7 小时前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin