1.SharePreferences存储数据
用于存放一些类似登陆的配置信息,本质是一个xml文件,通过类似键值对的方式存储
- MODE_APPEND:追加方式存储
- MODE_PRIVATE:私有方式存储,其他应用无法访问(默认的操作模式)
- MODE_WORLD_READABLE:可被其他应用读取
- MODE_WORLD_WRITEABLE:可被其他应用写入
要想使用SharedPreference,首先要先获取它的对象,android提供了3类方法:
context类中的getSharedPreference()方法
这个方法接收两个参数,第一个用来指定SharePreference文件的名称。如果指定的文件不存在,则会创建一个,sharepreferences文件都是存放在/data/data/<package name>/shared_prefs/目录下的。第二个参数用于指定操作模式,目前只有MODE_PRIVATE是可选的,其他方式都被丢弃了。
Activity中的getPreferences()方法
这个方法和context类中的getSharedPreference()方法很相似,但是它只接受后面一个参数,他会自动将当前活动的类名作为SharePreference的文件名。
PreferenceManager类中的getDefaultSharedPreference()方法
这是一个静态方法,他接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名。得到SharePreferences对象之后,就可以向这个SharePreference文件中存储数据了。
实现方法:
1.调用SharePreference对象的edit()方法获取一个SharedPreferences.Editor对象
2.向SharedPreferences.Editor对象添加数据,添加一个布尔型数据就使用putBoolean()方法,添加一个字符串就使用putString()方法。
3.调用apply()方法将添加的数据提交。
代码:
savebtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();//获得editor对象
editor.putString("name","Tom");
editor.putInt("age",28);
editor.putBoolean("married",false);
editor.apply();//提交
}
});
好的,我遇到一个问题。。。。。data.xml文件没找到:
先mark一下,看下今晚能不能解决。
emmm,可能是没刷新的问题。现在有了:
然后现在将存储的数据找出来:
getSharedPreference()方法得到了SharePreferences对象,然后分别调用getString(),getInt()。。。等方法,去获取前面所存储的姓名,年龄和是否已婚,如果没有找到相应的值,就会使用方法中传入的默认值来代替。
实现一个小demo:
记住密码:
package com.example.persistencedemo;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import java.util.prefs.PreferenceChangeEvent;
public class LoginActivity extends AppCompatActivity {
private SharedPreferences pref;
private SharedPreferences.Editor editor;
private EditText accounttext;
private EditText passwordtext;
private Button login;
private CheckBox rememberPass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
pref= PreferenceManager.getDefaultSharedPreferences(this);
accounttext=findViewById(R.id.account);
passwordtext=findViewById(R.id.password);
rememberPass=findViewById(R.id.remember_pass);
login=findViewById(R.id.login);
boolean isRemember=pref.getBoolean("remember_password",false);
if(isRemember){
String account=pref.getString("account","");
String password=pref.getString("password","");
accounttext.setText(account);
passwordtext.setText(password);
rememberPass.setChecked(true);
}
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String account=accounttext.getText().toString();
String password=passwordtext.getText().toString();
if(account.equals("admin")&&password.equals("123456"))
{
editor=pref.edit();
if(rememberPass.isChecked())
{
editor.putBoolean("remember_password",true);
editor.putString("account",account);
editor.putString("password",password);
}else{
editor.clear();
}
editor.apply();
Intent intent=new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
finish();
}else{
Toast.makeText(LoginActivity.this,"account is invalid",Toast.LENGTH_LONG).show();
}
}
});
}
}
这里有点小问题,就是密码不能硬编码在这里,我在做后台的时候用的是MD5放进数据库里。因为i这里是个小demo所以为了方便这么写了,下面有关于操作数据库的内容。
2.文件存储(内外部)
外部存储:
将数据存在文件中
这种存储不对存储的内容做任何格式化处理,所有数据都是原封不动保存在文件当中。
使用范围:简单的文本数据或者二进制数据
Context类中提供一个openFileoutput()的方法,接收两个参数,第一个参数是文件名,第二个参数是文件的操作模式。操作模式分为两种:MODE_PRIVATE是默认的操作模式,表示有相同文件名的时候,所写入的文件会覆盖源文件的内容;Mode_APPEND表示如果文件存在,则往文件追加内容,不存在则创建新文件。
其实就是用java的io流来进行操作,注意所有的文件都是默认存储到/data/data/<packagename>/files/目录下的。
上代码:
public void save() {
String data = "data to save";
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这是存储文件的方法。我用java 的IO流还不太熟悉,明天会继续补充这方面的博客
加入一个文本编辑框:
<EditText
android:id="@+id/edit"
android:hint="type somthing here!"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
public class MainActivity extends AppCompatActivity {
private EditText edittext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edittext=(EditText)findViewById(R.id.edit);
}
@Override
protected void onDestroy() {
super.onDestroy();
String input=edittext.getText().toString();
save(input);
}
public void save(String input) {
String data = input;
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(data);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
当当!!开心~~成功!
从文件中读取数据:
Context类中提供了一个openFileInput()方法,用于从文件中读取数据,这个方法只接收一个参数,就是要读取的文件名,然后系统会自动到默认目录/data/data/<packagename>/files/去加载文件,并返回一个FileInputStream对象。
读取文件的代码:
public String load() {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line=reader.readLine())!=null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
调用load()方法:
String input=load();
if(!TextUtils.isEmpty(input)){
edittext.setText(input);
edittext.setSelection(input.length());//将光标移到文本末尾
Toast.makeText(this,"Success",Toast.LENGTH_LONG).show();;
}
外部存储:
外部存储就是缓存文件到sd卡中啦,为了不让开发者乱写文件路径让sd卡变得混乱不堪,谷歌提供一种最佳的外部存储方法:
统一路径为/Android/data/<package name>/files/...(该路径通常挂在/mnt/sdcard/下)
3.SQLite数据库存储
来了!!!这里开始复习了!不过安卓的原生数据库很少使用,一般在contentprovider里用的多
SQLite是一款轻量级的关系型数据库,运算速度快,占用资源少
4.第三方框架
ormLite:
不同的第三方框架以及特点:
下载网站:
我下载的下面这两个:
OrmLite使用步骤:
1.定义实体类,使用OrmLite注解表和字段
package com.example.ormlitedemo.bean;
import com.j256.ormlite.field.DataType;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.table.DatabaseTable;
@DatabaseTable(tableName = "tb_student")
public class Student {
//自动增长
@DatabaseField(generatedId = true)
private int id;
//如果不写这里的话其实也是可以的,因为他会有默认值
@DatabaseField(columnName = "name",dataType = DataType.STRING,canBeNull = false)
private String name;
@DatabaseField
private int age;
@DatabaseField
private String phone;
public Student( String name, int age, String phone) {
this.name = name;
this.age = age;
this.phone = phone;
}
public Student()
{
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", phone='" + phone + '\'' +
'}';
}
}
2.定义OrmLiteSqliteOpenHelper类
创建这个类的时候需要使用单例模式。使用synchronize关键字可以让多线程保持同步。
package com.example.ormlitedemo.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import com.example.ormlitedemo.bean.Student;
import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.table.TableUtils;
import java.sql.SQLException;
public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
private DatabaseHelper(Context context)
{
super(context,"text.db",null,1);
}
private static DatabaseHelper sHelper=null;
public static synchronized DatabaseHelper getInstance(Context context)
{
if(sHelper==null)
{
sHelper=new DatabaseHelper(context);
}
return sHelper;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
try {
TableUtils.createTable(connectionSource, Student.class);//建表
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource, int i, int i1) {
try {
TableUtils.dropTable(connectionSource,Student.class,true);//删除表
onCreate(sqLiteDatabase,connectionSource);//重建
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.获得对应表的DAO类
4.执行增删改查操作