第一次写博客,不足的地方欢迎大神批评指正,
废话不多说,进入正题,谈谈andorid的四种存储方式的用法和各自的特点.
第一种数据存储: SharedPreferences键值存储
1,特点:保存在内存,方便小巧,快速,但不宜存储大型数据,适合轻量型数据.
用法: 1,存储时(举例):
SharedPreferences preferences = this.getSharedPreferences("test",Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("test1", "test储存的是字符串");
editor.commit();
第二个参数有四种形式,对应如下:
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.
注意:加入数据后必须执行commit()方法,否则数据无效.
2:取出时
SharedPreferences preferences2 = this.getSharedPreferences("test",Activity.MODE_PRIVATE);
String str =references2.getString("test1", "");
Log.d("zjm", str);
String str =references2.getString("test1", "");
Log.d("zjm", str);
获取上面存储的数据,切记标识test必须对应,否则获取会出错.这样getstring()方法中的第二个参数的意思是假如获取不到,可以指定要返回的值,这里我们填空.
第二种是SQLite数据库存储:
特点: andorid 移动开发常用的一种轻量级数据库,功能相当完善,占用系统资源少,不过目当下流行的数据都一般存储在云端,该数据库也就只是作为辅助的作用;
用法:(以下代码带有注释,应该说的比较清晰了)
只要是继承SQLiteOpenHelpersqlite ,然后重写其三个方法即可.
下面是使用代码: 查询和保存的方法都已给出,主要是要弄明白通过数据库对象,来获取读写权限,然后执行保存和查询函数,实现相关的数据库基本功能:
public class MainActivity extends Activity {
public static String sqlname = "student";
public static int version = 1;
private MySqlte mySqlte;
private SQLiteDatabase database;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mySqlte = new MySqlte(this, sqlname, null, version);
// 插入示例:
int num = SaveData(1, "zjm");
Log.d("zjm", "第" + num + "个注册者");
//查询示例:
boolean bo = Select(1, "zjm");
if (bo) {
Log.d("zjm", "查有此人");
} else {
Log.d("zjm", "查wu此人");
}
}
// 数据库存储操作
public int SaveData(int userid, String username) {
database = mySqlte.getWritableDatabase(); // 获取写入权限
ContentValues contentValues = new ContentValues(); // 创建用于数据存储的键值对象
contentValues.put("userid", userid);
contentValues.put("username", username);
int id = (int) database.insert(sqlname, null, contentValues); // 将键值对存储到数据库,返回该条数据的id
database.close();
return id;
}
//查询
public boolean Select(int userid, String username) {
String id = userid + "";
database = mySqlte.getReadableDatabase();// 获取读取权限
Cursor cursor = database.query(sqlname, new String[] { "userid",
"username" }, "userid=? and username=?", new String[] { id,
username }, null, null, null);
if (cursor.moveToFirst()) {
return true;
}
return false;
}
}
第三种: 文件存储,纯碎io方面的知识.
特点:通用性强,简单易操作
用法:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//测试代码: (注意必须创建子线程,否则会报错,andorid4.0开始网络操作不可放于主线程)
new Thread(new Runnable() {
@Override
public void run() {
SaveFile();
}
}).start();
}
//保存网络下载的图片
public void SaveFile() {
FileOutputStream outputStream = null;
InputStream inputStream = null;
try {
// 获取sd卡路径,设置文件保存路径
String str = Environment.getExternalStorageDirectory().toString()
+ "/baidu.jpg";
File file = new File(str);
outputStream = new FileOutputStream(file); // 获取文件输出流,以便将数据写入sd卡
URL url = new URL("http://www.baidu.com/img/bdlogo.png");
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
inputStream = connection.getInputStream(); // 获取url地址的输入流
byte[] bt = new byte[1024];
int length = -1;
while ((length = inputStream.read(bt)) != -1) { // 边读边写
outputStream.write(bt, 0, length);
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结果:
注意: 上述操作都必须添加sd卡读取权限和网络权限,楼主当初就是大意了没加,然后悲剧了,还有就是要必须在子线程中执行该网络操作,否则会报错,原因代码注释中已经说了.
第四种:
ContentProvider (数据共享)
特点: ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制。一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制. 一般只有大型的商业性app才会采用这种机制,小程序一般用不到.
特点: ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制。一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制. 一般只有大型的商业性app才会采用这种机制,小程序一般用不到.