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,
String[] columns)

Add the names that are non-null in columns to s, separating
them with commas.

 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,
String selection,
String[] selectionArgs,
String groupBy,
String having,
String sortOrder,
String limit)

Construct a SELECT statement suitable for use in a group of
SELECT statements that will be joined through UNION operators
in buildUnionQuery.

static String buildQueryString(boolean distinct,
String tables,
String[] columns,
String where,
String groupBy,
String having,
String orderBy,
String limit)

Build an SQL query string from the given clauses.

 String buildUnionQuery(String[] subQueries,
String sortOrder,
String limit)

Given a set of subqueries, all of which are SELECT statements,
construct a query that returns the union of what those
subqueries return.

 String buildUnionSubQuery(String typeDiscriminatorColumn,
String[] unionColumns,
Set<String> columnsPresentInTable,
int computedColumnsOffset,
String typeDiscriminatorValue,
String selection,
String[] selectionArgs,
String groupBy,
String having)

Construct a SELECT statement suitable for use in a group of
SELECT statements that will be joined through UNION operators
in buildUnionQuery.

 String getTables()

Returns the list of tables being queried

 Cursor query(SQLiteDatabase db,
String[] projectionIn,
String selection,
String[] selectionArgs,
String groupBy,
String having,
String sortOrder)

Perform a query by combining all current settings and the
information passed into this method.

 Cursor query(SQLiteDatabase db,
String[] projectionIn,
String selection,
String[] selectionArgs,
String groupBy,
String having,
String sortOrder,
String limit)

Perform a query by combining all current settings and the
information passed into this method.

 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
Android系统中数据基本都是私有的,一般存放在“data/data/程序包名”目录下。如果要实现数据共享,正确的方式是使用ContentProvider。
 

SharedPreference
SharedPreference是一种轻型的数据存储方式,实际上是基于XML文件存储的“key-value”键值对数据。通常用来存储程序的一些配置信息。其存储在“data/data/程序包名/shared_prefs目录下。
SharedPreference本身只能获取数据,不支持存储和修改。存储和修改要通过Editor对象来实现。
 
修改和存储数据
  • 根据Context的getSharedPrerences(key, [模式])方法获取SharedPreference对象;
  • 利用SharedPreference的editor()方法获取Editor对象;
  • 通过Editor的putXXX()方法,将键值对存储数据;
  • 通过Editor的commit()方法将数据提交到SharedPreference内。
综合例子:
    //设置单例里面的数值,然后再将数值写入到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)方法获取数据。
 
综合例子:
    //从单例里面找,如果不存在则在SharedPreferences里面读取
    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
SQLite是一个轻量级关系型数据库,既然是关系型数据库,那操作起来其实跟mysql、sql server差不多的。
需要注意的一点是,SQLite只有NULL、INTEGER、REAL(浮点数)、TEXT(字符串)和BLOB(大数据)五种类型,不存在BOOLEAN和DATE类型。
 
创建数据库
        通过openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)方法创建,如果库已创建,则打开数据库。
SQLiteDatabase db =this.openOrCreateDatabase("test_db.db", Context.MODE_PRIVATE, null);
创建表
        SQLiteDatabase没有提供创建表的方法,所以要靠execSQL()方法来实现。看名字也知道execSQL()用于直接执行sql的。
String sql="create table t_user (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL,password TEXT NOT NULL)";
db.execSQL(sql);
 
        使用SQLiteDatabase的insert(String table, String nullColumnHack, ContentValues values)方法插入数据。ContentValues 类,类似于java中的Map,以键值对的方式保存数据。
ContentValues values=new ContentValues();
values.put("name", "liangjh");
values.put("password", "123456");
db.insert("t_user", "id", values);
 
        删除数据就比较直接了。使用SQLiteDatabase的delete(String table, String whereClause, String[] whereArgs)实现。如果不想把参数写在whereArgs里面,可以直接把条件写在whereClause里面。
// 方式1 直接将条件写入到条件里面(个人觉得容易被注入,但其实数据都在客户端,没啥安全性可言)
db.delete("t_user", "id=1", null);
// 方式2 条件分开写,感觉比较安全
db.delete("t_user", "name=? and password =?", new String[]{"weiyg","112233"});
        查询有2个方法,query()和rawQuery()两个方法,区别在于query()是将sql里面的各参数提取出query()对应的参数中。可参考下面例子。
// 使用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();
}
 
        使用SQLiteDatabase 的update(String table, ContentValues values, String whereClause, String[] whereArgs)可以修改数据。whereClause和whereArgs用于设置其条件。ContentValues对象为数据。
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()可以设置事务。


File
        文件储存方式,很久以前讲过,这里不说明。
 

 
ContentProvider
ContentProvider相对于其它的方式比较复杂,当然其功能相对于其它的方式也是革命性的改变。它能够实现跨应用之间的数据操作。利用ContentResolver对象的delete、update、insert、query等方法去操ContentProvider的对象,让ContentProvider对象的方法去对数据操作。实现方式为:
  • 在A程序中定义一个ContentProvider,重载其增删查改等方法;
  • 在A程序中的AndroidManifest.xml中注册ContentProvider;
  • 在B程序中通过ContentResolver和Uri来获取ContentProvider的数据,同样利用Resolver的增删查改方法来获得和处理数据。
在A程序定义一个Provider
新建一个类,继承ContentProvider,并重载其delete()、insert()、query()、update()、getType()、onCreate()方法。譬如下面的例子,重载其onCreate和query方法。
 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 }
 
 
注册ContentProvider
在AndroidManifest.xml中声明ContentProvider,authorities 属性定义了ContentProvider的Uri标识。关于Uri标识属另一个范畴,自行查询。provider标识要放 在<application></application>里面。如果遇到了"Permission Denial: opening provide..."的错误,可以试试在节点加“android:exported="true"”。
<application ...>
...
<provider android:name=".MyProvider" android:authorities="com.example.androidtestdemo" android:exported="true"/>
</application>
在B程序获取数据
用Context获取到当前的ContentResolver,根据Uri地址和ContentResolver的query方法获取A程序的数据。Uri地址和A程序中AndroidManifest.xml定义的autorities要一致。当然,同类可以进行其它的操作。
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数据的四种存储方式的更多相关文章

  1. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览

    Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览   作为一个完成的应用程序,数据存储操作是必不可少的. ...

  2. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  3. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider

    ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...

  4. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite

    SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...

  5. (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  6. [Android]Android数据的四种存储方式

    存储方式 Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/d ...

  7. Android数据的四种存储方式

    作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File. ...

  8. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File

    作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别 是:SharePreference.SQLite.Content Provider和File ...

  9. Android开发_Android数据的四种存储方式

    Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...

随机推荐

  1. docker ubuntu容器更换阿里源(转)

    问题:使用docker 利用下载的ubuntu镜像启动容器时,使用的源下载更新软件的速度较慢. 解决这个问题的方法是跟新ubuntu容器的源 示例:以ubuntu为基础镜像 启动一个名称为 test0 ...

  2. 不相交集ADT--数组实现

    不相交集是解决等价问题的一种有效的数据结构,之所以称之为有效是因为,这个数据结构简单(几行代码,一个简单数组就可以搞定),快速(每个操作基本上可以在常数平均时间内搞定). 首先我们要明白什么叫做等价关 ...

  3. python之supervisor进程管理工具

    supervisor是python写的一个管理进程运行的工具,可以很方便的监听.启动.停止.重启一个或多个进程:有了supervisor后,就不用字节写启动和监听的shell脚本了,非常方便. sup ...

  4. ACM International Collegiate Programming Contest World Finals 2014

    ACM International Collegiate Programming Contest World Finals 2014 A - Baggage 题目描述:有\(2n\)个字符摆在编号为\ ...

  5. Tutorial 2: Requests and Responses

    转载自:http://www.django-rest-framework.org/tutorial/2-requests-and-responses/ Tutorial 2: Requests and ...

  6. Nginx-1.6.3源码安装、虚拟主机

    源码安装nginx cat /etc/redhat-release uname -rm yum install pcre-devel openssl-devel -y rpm -qa pcre pcr ...

  7. charles抓包误点deny处理办法及日常抓包

    误点deny方法在最底下~~ (博文为转载) 我们在开发网站项目的时候,我们可以通过浏览器的debug模式来看request以及response的数据,那么如果我们开发移动端项目没有网页呢?如何抓取数 ...

  8. PHP的instanceof关键字

    PHP5的另一个新成员是instdnceof关键字.使用这个关键字可以确定一个对象是类的实例.类的子类,还是实现了某个特定接口,并进行相应的操作.在某些情况下,我们希望确定某个类是否特定的类型,或者是 ...

  9. csv 文件乱码问题

    问题背景: Pandas.DataFrame 数据结构df在调用df.to_csv()方法生成csv文件格式的字符串(调用df.to_csv('test.csv')直接生成文件也有这个问题)作为字符串 ...

  10. 用WP SMTP插件实现邮件发送功能

    WordPress本身是采用mail()函数发邮件的,但是这样发出的邮件很容易被放入垃圾箱,很多主机商(特别是Windows主机)为了避免用户滥发邮件直接禁用了mail()函数,还有些云计算平台(比如 ...