Android-数据存储方式

 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:

 不同的第三方框架以及特点:

 下载网站:

http://ormlite.com/releases/

我下载的下面这两个:

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.执行增删改查操作

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值