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类中的getSharedPreferences() 方法,此方法接收两个参数,第一个是文件名,第二个是文件的操作模式。
  • 通过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() 方法用于获取到某一列在表中对应的位置索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值