Android提供的数据存储有3种:SharePreference,File,SQLite
(1)SharePreference
这个就是创建一个XML文件保存起来而已,保存的内容全部都是键值对,可以说是一个Map了,数据保存在/data/data/<package name>/shared_prefs文件夹里面,注意是根目录下,没root权限的手机是看不到进不到去那个文件夹的。
创建SharePreference对象,第一个参数是创建的XML文件名,第二个是模式参数:MODE_PRIVATE(只允许该应用程序访问),MODE_WORLD_READABLE(允许其他应用程序可读),MODE_WORLD_WRITEABLE(允许其他应用程序可读写)
sharedPreferences=getSharedPreferences("test", MODE_WORLD_READABLE);
获得sharePreference对象可以获取key="name"的值,如果不存在该key就返回第二个参数
sharedPreferences.getString("name", "")
获取SharePreference.Editor类的对象用于写入key-value对:
editor=sharedPreferences.edit();
editor.putString("name", name.getText().toString());
editor.putString("age", age.getText().toString());
editor.commit();
最后必须记得要调用commit()保存。
其他应用程序也可以利用这个XML,利用createPackageContext函数来获取其他应用程序的context:
Context context=createPackageContext("com.example.sharepreferencetest", Context.CONTEXT_IGNORE_SECURITY);
sharedPreferences=context.getSharedPreferences("test", MODE_WORLD_READABLE);
(2)File
文件保存数据分两种,一种是默认存在/data/data/<package name>/files里面的,一种是可选位置,存在SD卡的存在/data/data/<package name>/files里面的
openFileOutput(文件名,MODE);返回的就是那个路径下myfile.txt的文件输出流
openFileInput(文件名,MODE);返回的就是那个路径下myfile.txt的文件输入流
FileOutputStream fos=openFileOutput("myfile.txt", MODE_WORLD_READABLE);
fos.write(edit1.getText().toString().getBytes());
fos.close();
FileInputStream fis=openFileInput("myfile.txt");
byte buffer[]=new byte[fis.available()];
fis.read(buffer);
edit2.setText(new String(buffer));
存在SD卡的
确保SD卡中创建和删除文件的权限和往SD卡写数据的权限:
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
为true就意味着插有SD卡
获取SD卡的目录:
File sdcardDir=Environment.getExternalStorageDirectory();
在SD卡目录下建立自己的文件:
File file=new File(sdcardDir, "test.txt");
if(!file.exists())
{
file.createNewFile();
}
FileOutputStream fos=new FileOutputStream(file);
fos.write(edit1.getText().toString().getBytes());
fos.close();
fis.available()返回的是输入流的可读字节数
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
File sdcardDir=Environment.getExternalStorageDirectory();
File file=new File(sdcardDir, "test.txt");
FileInputStream fis=new FileInputStream(file);
byte buffer[]=new byte[fis.available()];
fis.read(buffer);
edit2.setText(new String(buffer));
(3)SQLite
内嵌在手机的数据库,实际上也是一个文件,所有资料全部保存在这个单文件中,文件名为*.db
创建数据库:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
File sdcardDir=Environment.getExternalStorageDirectory();
File dbfile=new File(sdcardDir, "database.db");
SQLiteDatabase db=SQLiteDatabase.openOrCreateDatabase(dbfile, null);
SQLiteDatabase的静态方法openOrCreateDatabase(File,null);创建或者打开数据库
生成表:
String sql="create table UserTb1(_id integer primary key autoincrement,username text,password text)";
db.execSQL(sql);
插入记录:
sql="insert into UserTb1(username,password) values('apple','123')";
db.execSQL(sql);
sql="insert into UserTb1(username,password) values('banana','111')";
db.execSQL(sql);
删除记录:
sql="delete from UserTb1 where _id=1";
db.execSQL(sql);
查询记录:
Cursor cursor=db.query("UserTb1", null, null, null, null, null, null);
if(cursor.moveToFirst())
{
for(int i=0;i<cursor.getCount();i++)
{
res+=cursor.getInt(0)+" ";
res+=cursor.getString(1)+" ";
res+=cursor.getString(2)+" \n";
cursor.moveToNext();
}
}
TextView showTextView=(TextView)findViewById(R.id.show);
showTextView.setText(res);
Cursor类就相当于一个结果集,有很多move的方法使得当前针对于某一条记录,然后调用getXxx(index)来获取某条记录的index列的数据
SQLiteDatabase.query(String table,后面全是null);获取的就是整个表的数据了,另外还有一个rawQuery("SQL的select语句",null);返回的就是Cursor类对象,也可以用于查询