Android开发小结Part12:4种存储方式


一.SharedPreferences
一种轻型的数据存储方式,它是一种基于XML文件存储key-value键值的数据,通常用于存储一些简单的配置信息;
它的存储位置在/data/data/<包名>/shared_prefs目录下;
其本身只能获取数据而不支持存储和修改,但可以通过Editor对象实现。

1.具体实现步骤如下:
1)根据Context获取SharePreferences对象
2)利用edit()方法获取Editor对象
3)通过Editor对象存储key-value键值对数据
4)通过commit方法提交数据

2.支持的数据类型
boolean,int,float,long,String

3.代码实例:
1)获取SharePreferences对象 
public class SimplePreferenceDemo extends Activity {
	
	private EditText nameText;
	private EditText ageText;

            
	public static final String PREFERENCE_NAME = "SaveSetting";
	public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;
         private SharePreferences mShared = null;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        nameText = (EditText)findViewById(R.id.name);
        ageText = (EditText)findViewById(R.id.age);


        
        mShared =getSharedPreferences(PREFERENCE_NAME, MODE);





    }

2)存储

private void write() {// 存入数据
      String savename = nameText.getText().toString().trim();
     int saveage = Integer.valueOf(ageText.getText().toString().trim());
     Editor editor = mShared.edit();
     editor.putString("Name", savename);
     editor.putInt("Age", saveage);
     // 保证操作的事务完整性
      editor.commit();
}
3)读取
private String read() {// 从XML文件里读取数据
       String namecontent = mShared.getString("Name", "数据库里没有存储姓名");
      int agecontent = mShared.getInt("Age", 0);
      String reading = "姓名:" + namecontent + "\n年龄:" + agecontent;
      return reading;
   }
4)清除内容
private void clear() {//清除内容
      /** 开始清除SharedPreferences中保存的内容 **/
      Editor editor = mShared.edit();
      editor.remove("Name");
      editor.remove("Age");
      editor.commit();
 
}
5)删除文件

private void delete() {//删除文件
      /** 删除SharedPreferences文件 **/
      Filefile = new File("/data/data/<包名>" + "/shared_prefs/"
            + PREFERENCE_NAME+".xml");
      if (file.exists()) {
         file.delete();
         Toast.makeText(this, "删除成功", Toast.LENGTH_LONG).show();
      }
}
二.File
文件(I/O)存储方法,常用存储大数量的数据,但是缺点是更新数据将是一件困难的事情。
三.SQLite
一种专为嵌入式设备设计的轻型数据库
1.数据类型
NULL: 空值

INTEGER: 整数
REAL: 浮点数
TEXT: 字符串
BLOB: 大数据

2.代码实例(登录注册)

1)User.java(JavaBean)

含id,username,password,age,sex
2)DatabaseHelper.java(使用SQLiteOpenHelper抽象类建立数据库)

public class DatabaseHelper extends SQLiteOpenHelper {
    static String name="user.db";
    static int dbVersion=1;
    public DatabaseHelper(Context context) {
        super(context, name, null, dbVersion);
    }
    //只在创建的时候用一次
    public void onCreate(SQLiteDatabase db) {
        String sql=
        "create table user(id integer primary key autoincrement," +
        "username varchar(20),password varchar(20),age integer,sex varchar(2))";
        //这个方法可用来执行非查询SQL指令
        //这些指令没有结果,包括create table/drop table/insert   
        db.execSQL(sql);
     }
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

}

3)UserService.java(实现对表的操作)

public class UserService {
    private DatabaseHelper dbHelper;
    public UserService(Context context){
        dbHelper=new DatabaseHelper(context);
    }
    
    //登录用
    public boolean login(String username,String password){
        SQLiteDatabase sdb=dbHelper.getReadableDatabase();
        String sql="select * from user where username=? and password=?";
        Cursor cursor=sdb.rawQuery(sql, new String[]{username,password});        
        if(cursor.moveToFirst()==true){
            cursor.close();
            return true;
        }
        return false;
    }
    //注册用
    public boolean register(User user){
        SQLiteDatabase sdb=dbHelper.getReadableDatabase();
        String sql="insert into user(username,password) values(?,?)";
        Object obj[]={user.getUsername(),user.getPassword()};
        sdb.execSQL(sql, obj);    
        return true;
    }
}


*关于Cursor

Android使用游标(Cursor)来导航查询结果;一个游标相当于一个简单的指针。
Cursor的常用方法:

 moveToFirst  将指针移到第一条数据上
 moveToNext  移到下一条
 moveToPrevious  移到上一条
 getCount  获取集合的数据数量
 getColumnIndexOrThrow  返回指定属性名称的序号,如果属性不存在,则产生异常
 getColumnName  返回指定序号的属性名称
 getColumnNames  返回所有属性名称的字符串数组
 getColumnIndex  根据属性名称返回序号
 moveToPosition  移到指定数据上
 getPosition  返回当前指针的位置



 

 








4)UserTest.java(测试类)

public class LoginActivity extends Activity {

	private User u;
	private UserService us;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        
        us = new UserService(this);

        Button btnRegister=(Button)findViewById(R.id.btnRegister);//注册按钮 
        btnRegister.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                EditText etUsername = (EditText) findViewById(R.id.etUsername);
                EditText etPassword = (EditText) findViewById(R.id.etPassword);

                u = new User();
                u.setUsername(etUsername.getText().toString());
                u.setPassword(etPassword.getText().toString());
                us.register(u);
             }    
        });               
        Button btnLogin = (Button) findViewById(R.id.btnLogin);//登录按钮
        btnLogin.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
						 
                     boolean flag = us.login(u.getUsername(),u.getPassword());
                     if(flag){
                         Log.i("登录结果","成功");
                     } else {
                         Log.i("登录结果","失败");    
                     } 

             }    
	});        

四.ContentProvider
可以在不同应用程序之间提供统一的接口;
Android为一些数据提供了ContentProvider,包括音频、视频、图片和通讯录等
1.关于Uri
每个ContentProvider都拥有一个公共的Uri,这个Uri用于表示这个ContentProvider所提供的数据
2.所提供的函数
query():查询
insert():插入
update():更新
delete():删除
getType():得到数据类型
onCreate():创建时的回调函数
3.实现步骤
1)定义一个CONTENT_URI常量
2)定义一个类,继承ContentProvider
3)实现query,insert,update,delette,getType,onCreate方法
4)在AndroidMainfest.xml里注册声明

*关于ContentProvider的详细使用,请看后续博文。

你可能感兴趣的:(ContentProvider,sqlite,File,Andoird存储方式)