IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android--实现数据持久化 -> 正文阅读

[移动开发]Android--实现数据持久化

文件存储

存入文件:

private void save() {
		String content = "hello world";
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            out = openFileOutput("data", MODE_APPEND);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(content);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            }catch (IOException e) {
                    e.printStackTrace();
            }
        }
    }

核心方法:openFileOutput() 方法,此方法接收两个参数,第一个文件名(不可以包含路径),第二个是文件的操作模式。此方法返回一个FileoutputStream对象,用于构建一个BufferedWriter对象

读取文件:

private String load() {
        FileInputStream in = null;
        BufferedReader reader = null;
        String content = "";
        try {
            in = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                content += line;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return content;
    }

核心方法:openFileInput() 方法,此方法接收一个参数:文件名(不可以包含路径)。此方法返回一个FileInputStream对象,用于构建一个BufferedReader对象

简单实现退出程序保存数据开启程序读取数据

保存在EditText中所写数据:

public class FileTest extends AppCompatActivity {

    EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file_test);
        
        editText = (EditText) findViewById(R.id.edittext);
        
        String content = load();
        if (!TextUtils.isEmpty(content)) {//一次性判断文件数据content是null或是空字符
            //文件中有数据就在打开程序的时候设置到EditText上
            editText.setText(content);
            editText.setSelection(content.length());//将输入光标移到末尾
            Toast.makeText(this, "Restoring succeed", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        String content = editText.getText().toString();
        save(content);
    }

    private void save(String content) {
        FileOutputStream out = null;
        BufferedWriter writer = null;
        try {
            out = openFileOutput("data", MODE_APPEND);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(content);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (writer != null) {
                    writer.close();
                }
            }catch (IOException e) {
                    e.printStackTrace();
            }
        }
    }

    private String load() {
        FileInputStream in = null;
        BufferedReader reader = null;
        String content = "";
        try {
            in = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(in));
            String line = "";
            while ((line = reader.readLine()) != null) {
                content += line;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return content;
    }

}

SharedPreference存储

SharePreference是使用键值对的方式来存储数据的。支持多种不同数据类型存储。

存数据用法

1.首先获取SharePreferences对象

  • 通过Context类中的SharedPreferences()方法,此方法接收两个参数,第一个是文件名,第二个是文件的操作模式。
  • 通过Activity类中的getPreference()方法,此方法接收一个参数:操作模式,因为这个方法会自动将当前活动类名作为SharedPreferences的文件名。
  • 通过PreferenceManager类中的getDefaultSharedPreferences()方法,此方法接收一个Context参数,并自动将当前应用程序的包名作为前缀来命名SharedPreferences文件。

2.调用SharedPreferences对象的edit()方法获取一个SharedPreferences.Editor对象。

3.向SharedPreferences.Editor对象中添加数据,比如添加一个字符串:putString(“name”, “Tom”)。

4.调用apply()方法将添加的数据提交,从而完成数据存储操作。

此处也可使用commit()方法
commit()和apply()的区别

读数据用法

1.首先获取SharePreferences对象

2.使用SharePreferences对象的get()方法读取,例如:getString(),该方法接收两个参数,第一个时键,第二个是当找不到键所对应值时,它用于指定值。

简单实现写数据和读取数据

        Button buttonWrite = (Button) findViewById(R.id.write);
        buttonWrite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
                editor.putString("name", "Tom");
                editor.putFloat("tall", 188);
                editor.apply();
            }
        });
        
        Button buttonRead = (Button) findViewById(R.id.read);
        buttonRead.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);
                String name = pref.getString("name", "");//当找不到键所对应值时,第二个参数用于指定值
                float tall = pref.getFloat("tall", 0);
            }
        });
    } 

数据库存储

SQLite数据库存储

借助SQLiteOpenHelper帮助类可以简单地对数据库进行创建和升级,SQLiteOpenHelper是一个抽象类,使用它时就需要自己创建一个帮助类去继承它

首先新建MyDatabaseHelper帮助类继承自SQLiteOpenHelper

public class MyDatabaseHelper extends SQLiteOpenHelper {

    private static final String CREATE_BOOK = "create table Book ("//建表语句
            + "id integer primary key autoincrement, "
            + "author text, "
            + "price real, "
            + "name text )";

    private static final String CREATE_Category = "create table Category ("//建表语句
            + "id integer primary key autoincrement, "
            + "category_name text, "
            + "category_code integer)";
    
    private Context mContext;

    public MyDatabaseHelper(@Nullable Context context, @Nullable String name,
                            @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);//执行建表语言
        Toast.makeText(mContext, "Create succeed", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {//升级数据库
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }

}

该类中onCreate()方法用于创建表,onUpgrade()方法用于升级数据库。

public class FileTest extends AppCompatActivity {

    private EditText editText;

    private MyDatabaseHelper dbHelper;

    private SQLiteDatabase db;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_file_test);

一.创建数据库

        dbHelper = new MyDatabaseHelper(FileTest.this, "BookStore.db", null, 1);//构建SQLiteOpenHelper实例
        Button createButton = (Button) findViewById(R.id.create_database);
        createButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                db = dbHelper.getWritableDatabase();//创建数据库,并调用MyDatabaseHelper中的onCreate()方法创建Book表
            }
        });

创建数据库时首先创建帮助类对象,构造方法传入四个参数,第一个context,第二个用于指定数据库名,第三个参数允许我们查询数据时返回一个Cursor对象,一般传入null,第四个参数表示当前数据库的版本号,更新数据库是要改值。

二.添加数据

        Button insertButton = (Button) findViewById(R.id.insert);
        insertButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ContentValues values = new ContentValues();
                values.put("name", "The Three Country");
                values.put("author", "ljh");
                values.put("price", 222.2);
                db.insert("Book", null, values);//添加数据
                values.clear();
            }
        });

SQLiteDatabase中提供了insert() 用于添加数据,他接收三个参数,第一个表名,第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值NULL,一般用不到,直接传入null,第三个是一个ContentValues对象,它提供了put()方法,用于向ContentValues中添加数据,之后传递给insert()。

三.更新数据

        Button upDataButton = (Button) findViewById(R.id.upData);
        upDataButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ContentValues values = new ContentValues();
                values.put("price", 888.8);
                db.update("Book", values, "name = ?", new String[]{"The Three Country"});//将书名为The Three Country的书价格更新
            }
        });

SQLiteDatabase中提供了updata() 用于更新数据,他接收四个参数,第一个表名,第二个参数是一个ContentValues对象,它提供了put()方法,用于向ContentValues中添加数据,第三个参数用于约束,第四个参数用于给占位符赋值

四.删除数据

        Button deleteButton = (Button) findViewById(R.id.delete);
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                db.delete("Book", "price > ?", new String[]{"500"});//将价格大于500的数都删掉
            }
        });

SQLiteDatabase中提供了delete() 用于删除数据,他接收三个参数,第一个表名,第二个参数用于约束,第三个参数用于给占位符赋值

五.查询数据

        Button queryButton = (Button) findViewById(R.id.query);
        queryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Cursor cursor = db.query("Book",null,null,null,
                        null,null,null);//查询数据
                if (cursor.moveToFirst()) {
                    do {
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String author = cursor.getString(cursor.getColumnIndex("author"));
                        double price = cursor.getDouble(cursor.getColumnIndex("price"));
                    } while (cursor.moveToNext());
                }
            }
        });
    }
    
}

SQLiteDatabase中提供了query() 用于查询数据,他返回一个Cursor对象,查询到的数据都将从这个对象中取出。
Cursor的get() 方法用于获取数据
Cursor的getColumnIndex() 方法用于获取到某一列在表中对应的位置索引

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:35:19  更:2021-08-21 15:35:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:07:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码