[转][Android]Android数据的四种存储方式
android.database.sqlite
类 SQLiteQueryBuilder
java.lang.Object
android.database.sqlite.SQLiteQueryBuilder
public class SQLiteQueryBuilderextends Object
This is a convience class that helps build SQL queries to be sent to SQLiteDatabase objects.
| 构造方法摘要 | |
|---|---|
SQLiteQueryBuilder() |
|
| 方法摘要 | |
|---|---|
static void |
appendColumns(StringBuilder s,
Add the names that are non-null in columns to s, separating |
void |
appendWhere(CharSequence inWhere)
Append a chunk to the WHERE clause of the query. |
void |
appendWhereEscapeString(String inWhere)
Append a chunk to the WHERE clause of the query. |
String |
buildQuery(String[] projectionIn,
Construct a SELECT statement suitable for use in a group of |
static String |
buildQueryString(boolean distinct,
Build an SQL query string from the given clauses. |
String |
buildUnionQuery(String[] subQueries,
Given a set of subqueries, all of which are SELECT statements, |
String |
buildUnionSubQuery(String typeDiscriminatorColumn,
Construct a SELECT statement suitable for use in a group of |
String |
getTables()
Returns the list of tables being queried |
Cursor |
query(SQLiteDatabase db,
Perform a query by combining all current settings and the |
Cursor |
query(SQLiteDatabase db,
Perform a query by combining all current settings and the |
void |
setCursorFactory(SQLiteDatabase.CursorFactory factory)
Sets the cursor factory to be used for the query. |
void |
setDistinct(boolean distinct)
Mark the query as DISTINCT. |
void |
setProjectionMap(Map<String,String> columnMap)
Sets the projection map for the query. |
void |
setTables(String inTables)
Sets the list of tables to query. |
Android提供以下四种存储方式:
- SharePreference
- SQLite
- File
- ContentProvider
- 根据Context的getSharedPrerences(key, [模式])方法获取SharedPreference对象;
- 利用SharedPreference的editor()方法获取Editor对象;
- 通过Editor的putXXX()方法,将键值对存储数据;
- 通过Editor的commit()方法将数据提交到SharedPreference内。

private String setCityName(String _cityName){
City.getCity().setCityName(_cityName);
Context ctx =MainActivity.this;
SharedPreferences sp =ctx.getSharedPreferences("CITY", MODE_PRIVATE);
Editor editor=sp.edit();
editor.putString("CityName", City.getCity().getCityName());
editor.commit();
return City.getCity().getCityName();
}

- 同样根据Context对象获取SharedPreference对象;
- 直接使用SharedPreference的getXXX(key)方法获取数据。

private String getCityName(){
String cityName = City.getCity().getCityName();
if(cityName==null ||cityName==""){
Context ctx =MainActivity.this;
SharedPreferences sp =ctx.getSharedPreferences("CITY", MODE_PRIVATE);
City.getCity().setCityName(sp.getString("CityName", "广州"));
}
return City.getCity().getCityName();
}

- getSharedPrerences(key, [模式])方法中,第一个参数其实对应到XML的文件名,相同key的数据会保存到同一个文件下。
- 使用SharedPreference的getXXX(key)方法获取数据的时候,如果key不存在的活,不会出现报错,会返回none。建议使用getXXX()的时候指定默认值。
SQLite是一个轻量级关系型数据库,既然是关系型数据库,那操作起来其实跟mysql、sql server差不多的。需要注意的一点是,SQLite只有NULL、INTEGER、REAL(浮点数)、TEXT(字符串)和BLOB(大数据)五种类型,不存在BOOLEAN和DATE类型。
String sql="create table t_user (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL,password TEXT NOT NULL)";
db.execSQL(sql);
ContentValues values=new ContentValues();
values.put("name", "liangjh");
values.put("password", "123456");
db.insert("t_user", "id", values);
// 方式1 直接将条件写入到条件里面(个人觉得容易被注入,但其实数据都在客户端,没啥安全性可言)
db.delete("t_user", "id=1", null);
// 方式2 条件分开写,感觉比较安全
db.delete("t_user", "name=? and password =?", new String[]{"weiyg","112233"});

// 使用rawQuery
// Cursor c = db.rawQuery("select * from t_user", null);
// db.rawQuery("select * from t_user where id=1", null);
// db.rawQuery("select * from t_user where id=?", new String[]{"1"}); // 使用query()
Cursor c = db.query("t_user", new String[]{"id","name"}, "name=?", new String[]{"weiyg"}, null, null, null);
c.moveToFirst();
while(!c.isAfterLast()){
String msg="";
for(int i=0,j=c.getColumnCount();i<j;i++){
msg+="--"+c.getString(i);
}
Log.v("SQLite", "data:"+msg);
c.moveToNext();
}


ContentValues values=new ContentValues();
values.put("password", "111111");
// 方式1 条件写在字符串内
db.update("t_user", values, "id=1", null);
// 方式2 条件和字符串分开
db.update("t_user", values, "name=? or password=?",new String[]{"weiyg","123456"});

无论何时,打开的数据库,记得关闭。
db.close()
另外使用beginTransaction()和endTransaction()可以设置事务。
- 在A程序中定义一个ContentProvider,重载其增删查改等方法;
- 在A程序中的AndroidManifest.xml中注册ContentProvider;
- 在B程序中通过ContentResolver和Uri来获取ContentProvider的数据,同样利用Resolver的增删查改方法来获得和处理数据。

1 public class MyProvider extends ContentProvider {
2
3 @Override
4 public int delete(Uri uri, String selection, String[] selectionArgs) {
5 // TODO Auto-generated method stub
6 return 0;
7 }
8
9 @Override
10 public String getType(Uri uri) {
11 // TODO Auto-generated method stub
12 return null;
13 }
14
15 @Override
16 public Uri insert(Uri uri, ContentValues values) {
17 // TODO Auto-generated method stub
18 return null;
19 }
20
21 @Override
22 public boolean onCreate() {
23 // 新建个数据库并插入一条数据
24 SQLiteDatabase db=this.getContext().openOrCreateDatabase("test_db2.db", Context.MODE_PRIVATE, null);
25 db.execSQL("CREATE TABLE t_user (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL)");
26 ContentValues values=new ContentValues();
27 values.put("name", "liangjh2");
28 db.insert("t_user", "id", values);
29 db.close();
30 return false;
31 }
32
33 @Override
34 public Cursor query(Uri uri, String[] projection, String selection,
35 String[] selectionArgs, String sortOrder) {
36 // 获取数据
37 SQLiteDatabase db=this.getContext().openOrCreateDatabase("test_db2.db", Context.MODE_PRIVATE, null);
38 Cursor c = db.query("t_user", null, null, null, null, null, null);
39 db.close();
40 return c;
41 }
42
43 @Override
44 public int update(Uri uri, ContentValues values, String selection,
45 String[] selectionArgs) {
46 // TODO Auto-generated method stub
47 return 0;
48 }
49
50 }

<application ...>
...
<provider android:name=".MyProvider" android:authorities="com.example.androidtestdemo" android:exported="true"/>
</application>

Context ctx=MainActivity.this;
ContentResolver resolver =ctx.getContentResolver();
Uri uri=Uri.parse("content://com.example.androidtestdemo");
Cursor c = resolver.query(uri, null, null, null, null);
c.moveToFirst();
while(!c.isAfterLast()){
for(int i=0,j=c.getColumnCount();i<j;i++){
Log.v("Android2",""+c.getString(i));
}
c.moveToNext();
}

[转][Android]Android数据的四种存储方式的更多相关文章
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的. ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider
ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite
SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...
- (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- [Android]Android数据的四种存储方式
存储方式 Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/d ...
- Android数据的四种存储方式
作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File
作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别 是:SharePreference.SQLite.Content Provider和File ...
- Android开发_Android数据的四种存储方式
Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...
随机推荐
- 好消息! 不用再羡慕Python有jupyter 我R也有Notebook了【附演示视频】
熟悉python的朋友可能知道jupyter notebook.它是一个Web应用程序,允许你创建和共享代码,方程,可视化和说明性文本文档.现在,我们可以在RStudio中实现R Notebook的功 ...
- PHP对象1: 创建对象与 $this
<?php class perl{ public $name; function __construct($name){ echo '一个对象造好了<br/>'; $this-> ...
- php中的转义函数
<?php parse_url 解析URL, 返回各组成部分 urlencode/urldecode url编码/解码 htmlentities 将字符串转化为html实体 htmlentiti ...
- python基础===利用unittest进行测试用例执行的几种方式
利用python进行测试时,测试用例的加载方式有2种: 一种是通过unittest.main()来启动所需测试的测试模块: 一种是添加到testsuite集合中再加载所有的被测试对象,而tests ...
- 设计模式之笔记--享元模式(Flyweight)
享元模式(Flyweight) 定义 享元模式(Flyweight),运用共享技术有效地支持大量细粒度的对象. 类图 描述 Flyweight:抽象享元类,是所有的具体享元类的基类,为子类规定出需要实 ...
- discuz伪静态设置
Discuz! 通用伪静态 -包含所有类型主机本人找了一下午才找到的,谢谢这位原创者,发出来让大家用. 第一步:打开后台 全局 SEO设置 全部打勾<ignore_js_op> ...
- centos上git搭建
1 git的安装需要一些包: yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-Ex ...
- nginx 各种配置
first : mkdir /usr/local/nginx/conf/vhosts{网站配置}/usr/local/nginx/conf/vhosts/test.conf : server { li ...
- 主机名/etc/hosts文件的作用
1,/etc/hosts,主机名ip配置文件. # Do not remove the following line, or various programs # that require netwo ...
- HDU 17111 Number Sequence(KMP裸题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711 题目大意:给你两个数字数组a和b,若b是a的子序列则输出b在a中第一次出现的位置,否则输出-1. ...
