浅谈andorid的四种数据存储方式(也是为了方便自己以后查阅,会及时更新)

第一次写博客,不足的地方欢迎大神批评指正,

废话不多说,进入正题,谈谈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);
获取上面存储的数据,切记标识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卡根目录,相关流的操作都在代码里,也有注释,慢慢看,
注意: 上述操作都必须添加sd卡读取权限和网络权限,楼主当初就是大意了没加,然后悲剧了,还有就是要必须在子线程中执行该网络操作,否则会报错,原因代码注释中已经说了.

第四种: ContentProvider (数据共享)
特点:  ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制。一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.  一般只有大型的商业性app才会采用这种机制,小程序一般用不到.








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值