Android - 持久化方案

这篇具有很好参考价值的文章主要介绍了Android - 持久化方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android Studio文件夹:View -> Tool Windows -> Device Explorer

  1. 三种持久化方案

    • 文件存储
      • 文件写入模式
        • MODE_APPEND:存在文件则追加内容
        • MODE_PRIVATE:存在文件则覆盖内容
    • SharedPreferences
    • 数据库
  2. 实践
    2.1 SharedPreferences存储、恢复数据

  • 编写UI页面(包含存储、清空、恢复数据按钮)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

   <TextView
       android:layout_width="wrap_content"
       android:layout_height="50dp"
       android:gravity="center"
       android:layout_marginLeft="30dp"
       android:layout_marginTop="17dp"
       android:textSize="20dp"
       android:text="用户名:" />

    <EditText
        android:id="@+id/username"
        android:layout_marginLeft="130dp"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:background="@color/purple_200"
        android:textSize="20dp"
        android:textColor="@color/black"
        android:layout_width="200dp"
        android:layout_height="40dp" />


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:gravity="center"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="80dp"
        android:textSize="20dp"
        android:text=" 密  码 :" />

    <EditText
        android:id="@+id/password"
        android:layout_marginLeft="130dp"
        android:layout_marginTop="80dp"
        android:gravity="center"
        android:background="@color/cardview_shadow_start_color"
        android:textSize="20dp"
        android:textColor="@color/black"
        android:layout_width="200dp"
        android:layout_height="40dp" />

    <Button
        android:id="@+id/login"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="150dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录" />

    <Button
        android:id="@+id/remove"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="200dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="清空" />

    <Button
        android:id="@+id/recover"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="250dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="恢复" />


</RelativeLayout>
  • 核心处理逻辑
public class SharedPreferencesStore extends AppCompatActivity {

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

        findViewById(R.id.login).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView usernameTextView = findViewById(R.id.username);
                String username = usernameTextView.getText().toString();

                TextView passwordTextView = findViewById(R.id.password);
                String password = passwordTextView.getText().toString();

                SharedPreferences loginMsg = getSharedPreferences("loginMsg", MODE_PRIVATE);
                SharedPreferences.Editor edit = loginMsg.edit();
                edit.putString("username", username);
                edit.putString("password", password);
                edit.apply();
            }
        });

        findViewById(R.id.remove).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView usernameTextView = findViewById(R.id.username);
                usernameTextView.setText(null);

                TextView passwordTextView = findViewById(R.id.password);
                passwordTextView.setText(null);

            }
        });

        findViewById(R.id.recover).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                SharedPreferences loginMsg = getSharedPreferences("loginMsg", MODE_PRIVATE);
                String username = loginMsg.getString("username", "");
                String password = loginMsg.getString("password", "");

                TextView usernameTextView = findViewById(R.id.username);
                usernameTextView.setText(username);

                TextView passwordTextView = findViewById(R.id.password);
                passwordTextView.setText(password);


            }
        });

    }

}

  • 数据存储地方:data/data/packageName/shared_prefs/fileName

2.2 Sqlite文章来源地址https://www.toymoban.com/news/detail-824746.html

  • 实现SqliteOpenHelper继承类
public class UserSql extends SQLiteOpenHelper {

    private Context context;

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

	// 创建DB
    @Override
    public void onCreate(SQLiteDatabase db) {

        String sql = "create table user( " +
                "id integer primary key autoincrement, " +
                "username text, " +
                "password text )";

        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
  • 编写CRUD

public class SqliteStore extends AppCompatActivity {


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_sqlite);
        UserSql userSql = new UserSql(this, "user.db", null, 1);


        // 增加
        findViewById(R.id.login).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView usernameTextView = findViewById(R.id.username);
                TextView passwordTextView = findViewById(R.id.password);

                String username = usernameTextView.getText().toString();
                String password = passwordTextView.getText().toString();

                SQLiteDatabase writableDatabase = userSql.getWritableDatabase();
                ContentValues contentValues = new ContentValues();
                contentValues.put("username", username);
                contentValues.put("password", password);
                contentValues.put("id", new Random().nextInt(100));
                writableDatabase.insert("user", null, contentValues);
                Toast.makeText(SqliteStore.this, "登录成功!", Toast.LENGTH_SHORT).show();
            }
        });

        // 删除
        findViewById(R.id.delete).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView usernameTextView = findViewById(R.id.username);
                String username = usernameTextView.getText().toString();

                SQLiteDatabase writableDatabase = userSql.getWritableDatabase();
                writableDatabase.delete("user", "username = ?", new String[]{username});

            }
        });

        // 修改
        findViewById(R.id.update).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView usernameTextView = findViewById(R.id.username);
                String username = usernameTextView.getText().toString();
                String updatePassword = "updateupdate";

                SQLiteDatabase writableDatabase = userSql.getWritableDatabase();
                ContentValues contentValues = new ContentValues();
                contentValues.put("password", updatePassword);
                writableDatabase.update("user", contentValues, "username = ?", new String[]{username});

            }
        });




        // 查询
        findViewById(R.id.search).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase readableDatabase = userSql.getWritableDatabase();
                Cursor cursor = readableDatabase.query("user", null, null, null, null, null, null);
                if (cursor.moveToFirst()) {
                    do {
                        String id = cursor.getString(cursor.getColumnIndexOrThrow("id"));
                        String username = cursor.getString(cursor.getColumnIndexOrThrow("username"));
                        String password = cursor.getString(cursor.getColumnIndexOrThrow("password"));
                        Toast.makeText(SqliteStore.this, id + username + password, Toast.LENGTH_LONG).show();
                    } while (cursor.moveToNext());
                }
            }
        });



        // 这个不用理,清楚输入框的
        findViewById(R.id.remove).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView usernameTextView = findViewById(R.id.username);
                TextView passwordTextView = findViewById(R.id.password);

                usernameTextView.setText(null);
                passwordTextView.setText(null);
            }
        });
    }
}

  • UI界面
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:gravity="center"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="17dp"
        android:textSize="20dp"
        android:text="用户名:" />

    <EditText
        android:id="@+id/username"
        android:layout_marginLeft="130dp"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:background="@color/purple_200"
        android:textSize="20dp"
        android:textColor="@color/black"
        android:layout_width="200dp"
        android:layout_height="40dp" />


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:gravity="center"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="80dp"
        android:textSize="20dp"
        android:text=" 密  码 :" />

    <EditText
        android:id="@+id/password"
        android:layout_marginLeft="130dp"
        android:layout_marginTop="80dp"
        android:gravity="center"
        android:background="@color/cardview_shadow_start_color"
        android:textSize="20dp"
        android:textColor="@color/black"
        android:layout_width="200dp"
        android:layout_height="40dp" />

    <Button
        android:id="@+id/login"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="150dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录" />

    <Button
        android:id="@+id/delete"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="200dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除" />

    <Button
        android:id="@+id/search"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="250dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查找" />


    <Button
        android:id="@+id/update"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="300dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改" />

    <Button
        android:id="@+id/remove"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="350dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="清空" />


</RelativeLayout>

  • LitePal操作Sqlite
    • 下载第三方LitePal的jar包,链接:https://github.com/guolindev/LitePal/tree/master/downloads
    • Android Studio导入,放到app/libs目录下,右键jar包 -> Add as library…
    • AndroidManifest.xml添加name,android:name=“org.litepal.LitePalApplication”
    • app/src/main目录下创建assets,再创建litepal.xml
<?xml version="1.0" encoding="utf-8"?>
<litepal>
	// 操作的数据库名称
    <dbname value="student"></dbname>
    // 迭代的版本号
    <version value="1"></version>

    <list>
    	// 关联的实体类
        <mapping class="com.example.myapplication.entity.Student"></mapping>
    </list>
</litepal>
- 创建实体类继承于DataSupport
public class Student extends DataSupport {

    private Integer id;

    private String username;

    private String password;

    public Student() {}

    public Student(Integer id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}


- CRUD
public class LitepalStore extends AppCompatActivity {

	// 创建数据库
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_litepal);

        findViewById(R.id.create_db).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                LitePal.getDatabase();
            }
        });

		// 新增
        findViewById(R.id.login).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int id = new Random().nextInt(100);
                String username = ((TextView) findViewById(R.id.username)).getText().toString();
                String password = ((TextView) findViewById(R.id.password)).getText().toString();
                Student student = new Student(id, username, password);
                student.save();
            }
        });

		// 删除
        findViewById(R.id.delete).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String username = ((TextView) findViewById(R.id.username)).getText().toString();
                Toast.makeText(LitepalStore.this, username, Toast.LENGTH_LONG).show();
                DataSupport.deleteAll(Student.class, "username = ?", username);
            }
        });

		// 修改
        findViewById(R.id.update).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String username = ((TextView) findViewById(R.id.username)).getText().toString();

                List<Student> studentList = LitePal.findAll(Student.class);
                Integer id = null;
                for (Student student : studentList) {
                    if (username.equals(student.getUsername())) {
                        id = student.getId();
                    }
                }

                Student student = new Student();
                student.setUsername(username);
                student.setPassword("updatePassword");

                student.update(id);

            }
        });


		// 查询
        findViewById(R.id.search).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                List<Student> studentList = LitePal.findAll(Student.class);
                for (Student student : studentList) {
                    Toast.makeText(LitepalStore.this, student.toString(), Toast.LENGTH_SHORT).show();
                }


            }
        });

    }

}


- UI代码

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:gravity="center"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="17dp"
        android:textSize="20dp"
        android:text="用户名:" />

    <EditText
        android:id="@+id/username"
        android:layout_marginLeft="130dp"
        android:layout_marginTop="20dp"
        android:gravity="center"
        android:background="@color/purple_200"
        android:textSize="20dp"
        android:textColor="@color/black"
        android:layout_width="200dp"
        android:layout_height="40dp" />


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:gravity="center"
        android:layout_marginLeft="30dp"
        android:layout_marginTop="80dp"
        android:textSize="20dp"
        android:text=" 密  码 :" />

    <EditText
        android:id="@+id/password"
        android:layout_marginLeft="130dp"
        android:layout_marginTop="80dp"
        android:gravity="center"
        android:background="@color/cardview_shadow_start_color"
        android:textSize="20dp"
        android:textColor="@color/black"
        android:layout_width="200dp"
        android:layout_height="40dp" />

    <Button
        android:id="@+id/create_db"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="150dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="创建数据库" />

    <Button
        android:id="@+id/login"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="200dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="登录" />

    <Button
        android:id="@+id/delete"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="250dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除" />

    <Button
        android:id="@+id/search"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="300dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查找" />


    <Button
        android:id="@+id/update"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="350dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改" />

    <Button
        android:id="@+id/remove"
        android:gravity="center"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="400dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="清空" />


</RelativeLayout>

到了这里,关于Android - 持久化方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Redis持久化与一致性解决方案

    怎样去验证我们的Redis缓存是否一定生效了呢? 很简单:如果缓存生效,那么我们每次查询数据是不是先从Redis里面查,那么好,我们先去查第一次,接着去改MySQL里面的数据值,此时再去查第二次,此时如果发现第二次查询到的数据值与与我们改过的MySQL里面的数据值不一致

    2024年02月05日
    浏览(42)
  • Redis - redis.windows.conf配置文件及RDB和AOF数据持久化方案

    Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。 Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。 该机制是指

    2024年01月24日
    浏览(56)
  • redis持久化【RDB+AOF】持久化双雄

    这是redis系列文章之《redis持久化【RDB+AOF】持久化双雄》,上一篇文章【redis基础】redis的十大数据类型_努力努力再努力mlx的博客-CSDN博客 感谢大家的支持~ 目录 RDB 什么是RDB RDB的作用 配置文件关于RDB部分  6vs7 操作步骤 修改配置文件(本案例设置5s修改2次) 修改dump文件的保

    2024年02月08日
    浏览(73)
  • RabbitMQ系列(8)--实现RabbitMQ队列持久化及消息持久化

    概念:在上一章文章中我们演示了消费者宕机的情况下消息没有被消费成功后会重新入队,然后再被消费,但如何保障RabbitMQ服务停掉的情况下,生产者发过来的消息不会丢失,这时候我们为了消息不会丢失就需要将队列和消息都标记为持久化。 1、实现RabbitMQ队列持久化 只需

    2024年02月09日
    浏览(37)
  • 全面解析 Redis 持久化:RDB、AOF与混合持久化

    前言: 每次你在游戏中看到玩家排行榜,或者在音乐应用中浏览热门歌单,有没有想过这个排行榜是如何做到实时更新的?当然,依靠 Redis 即可做到。 在技术领域,我们经常听到 「键值存储」 这个词。但在 Redis 的世界里,这只是冰山一角。Redis 的对象,不仅仅是简单的数据

    2024年03月10日
    浏览(63)
  • Redis 持久化-RDB和 持久化-AOF 的详细介绍以及区别

    在线文档: https://redis.io/topics/persistence RDB(Redis DataBase) AOF(Append Of File) 在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就Snapshot 快照,恢复时将快照文件读到内存 RDB 及其执行流程 对上图的解读 具体流程如下: redis 客户端执行bgsave 命令或者自动触发bgsave 命令;

    2024年02月09日
    浏览(66)
  • flutter:数据持久化

    保存数据到本地磁盘是应用程序常用功能之一,比如保存用户登录信息、用户配置信息等。而保存这些信息通常使用 shared_preferences ,它保存数据的形式为 Key-Value (键值对),支持 Android 和 iOS。 shared_preferences 是一个第三方插件,在 Android 中使用 SharedPreferences ,在 iOS中使用

    2024年02月09日
    浏览(42)
  • Docker 持久化

    为了能够保存(持久化)数据以及共享容器间的数据, Docker 提出了 Volume 的概念。简单来说, Volume 就是目录或者文件,它可以 绕过 默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。 数据卷方式: 数据卷是一个特殊的文件或者目录,它将宿主机文件或

    2024年02月03日
    浏览(46)
  • RabbitMQ 持久化

      通过持久化可以 尽量 防止在RabbitMQ异常情况下(重启、关闭、宕机)的数据丢失。持久化技术是解决消息存储到队列后的丢失问题,但是通过持久化并不能完全保证消息不丢失。   持久化技术可以分为交换机持久化、队列持久化以及消息持久化,它们的实现方案和实

    2024年02月12日
    浏览(40)
  • RabbitMQ---持久化

    • 如何避免消息丢失? 1) 消费者的ACK机制。可以防止消费者丢失消息。 2) 但是,如果在消费者消费之前,MQ就宕机了,消息就没了。 • 如何将消息进行持久化呢? 要将消息持久化,前提是:队列、Exchange都持久化

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包