Android本地存储总结
来源:互联网 发布:电脑版阅读软件 编辑:程序博客网 时间:2024/06/06 14:29
Android本地存储总结:
1.文件存储(IO流)
文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不动的保存到文件当中,因而它比较合适用于存储一些简单的文本数据或者二进制数据。如果你想使用文件存储方式来保存一些较为复杂的文本数据,就需要定义一套自己的格式规范,这样就可以方便之后将数据从文件中重新解析出来。
1.1 把数据存储到文件中
Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。这个方法接收两个参数,第一个是文件名,在文件创建的时候使用的就是这个名称,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data//files/目录下的。第二个参数是文件的操作模式,主要有两种模式可选,MODE_PRIVATE和MODE_APPEND。其中MODE_PRIVATE是默认的操作模式,表示当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容,而MODE_APPEND则表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。其文件的操作模式还有两种:MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE,这两种模式表示允许其他的应用程序对我们应用程序的文件进行读写操作,不过由于这两种模式过于危险,很容易引起应用的安全性漏洞,已经在Android 4.2版本中被废弃。
openFileOutput()方法返回的是一个FileOutoutStream对象,得到了这个对象之后就可以使用Java流的方式将数据写入到文件中了。示例代码如下:
public void save(){ String data = "Data to save"; FileOutputStream out = null; BufferedWriter writer = null; try{ out = openFileOutput("data",MODE_PRIVATE); writer = new BufferedWriter(new OutputStreamWriter(out)); writer.write(data); }catch(IOException e){ e.printStackTrace(); }finally{ try{ if(writer != null){ writer.close(); } }catch(IOException e){ e.printStackTrace(); } }}
这段程序是把“Data to save”存储到/data/data//files/data文件中了。
1.2 从文件中读取数据
类似于将数据存储到文件中,Contenxt类中还提供了一个openFileInput()方法,用于从文件中读取数据。这个方法要比openFileOutput()简单一些,它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data//files/目录下去加载这个文件,并返回一个FileInputStramReader对象,得到了这个对象之后再通过Java流方式就可以将数据读取出来了。示例代码如下:
public String load(){ FileInputStream in = null; BufferedReader reader = null; StringBuilder content = new StringBuilder(); try{ in = openFileInput("data"); reader = new BufferedReader(new InputStreamReader(in)); String line = ""; while((line = reader.readLine) != null){ content.append(line); } }catch(IOException e){ e.printStackTrace(); }finally{ if(reader != null){ try{ reader.close(); }catch(IOException e){ e.printStackTrace(); } } } }
这段代码表示读取文件/data/data//files/data中的内容并返回。
2.SharedPreferences存储
不同于文件的存储方式,SharedPreferences是使用键值对的方式来存储数据。也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。而且SharedPreferences还支持不同的数据类型存储,如果存储的数据类型是整型,那么读取出来的数据也是整型;如果存储的数据是一个字符从,那么读取出来的数据仍然是字符串。
这样你应该明显感觉到,使用SharedPreferences来进行数据持久化要比使用文件方便很多,但是存储流数据类型的比如图片,音频,视频等,使用SharedPreferences就不太合适了,只能这样说,当你需要存储字符串类型的数据,有字符拼接成的数据,当然SharedPreferences的好处远远大于文件的方式。
2.1 将数据存储到SharedPreferences中
要想得到读取或者写入数据到SharedPreferences,首先需要获取到SharedPreferences对象,Activity中主要提供了3种方法得到SharedPreferences对象,分别是:
1.Context类中的getSharedPreferences()方法,此方法接收两个参数,第一个参数用于指定SharedPrreferences文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences文件都存放在/data/data//shared_prefs/目录下。第二个参数用于指定操作模式,目前有MODE_PRIVATE这一种模式可选,它是默认的操作模式,和直接传入0效果是相同的,表示只有当前的应用程序才可以对Shared -Preferences文件进行读写。其他操作模式均已废弃, MODE_WORLD_READABLE
和 MODE_WORLD_WRITEABLE 这两种模式已在 Android 4.2 版本中被废弃,MODE_MULTI_PROCESS模式是在Android6.0版本中被废弃的。2.Activity类中的getPreferences()方法,这个方法和Context中的getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动产生将当前活动的类名作为SharedPrreferences的文件名。
3.PerferenceManager类中的getDefaultSharedPreferences()方法,这是一个静态方法,它接收一个Context参数,并自动使用当前应用程序的报名作为前缀来命名SharedPrreferences文件。
得到SharedPreferences对象后,就可以开始向SharedPreferences文件中存储数据了,主要分为3步实现:
(1)调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
(2)向SharedPreferences.Editor对象添加数据,比如添加一个布尔型数据就使用putBoolean()方法,添加一个字符串则使用putString()方法,以此类推。
(3)调用apply()方法将添加的数据提交,从而完成数据存储操作。示例代码如下:
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();editor.putString("name",Tom);//加入String键值对数据editor.putInt("age",28);//加入int键值对数据editor.putBoolean("married",false);//加入布尔键值对数据editor.apply();//提交
2.2 从SharedPreferences中读取数据
从SharedPreferences读取数据很简单,SharedPreferences对象中提供了一系列的get方法,用于对存储的数据进行读取,每种get方法都对应了SharedPreferences.Editor中的一种put方法,比如读取一个布尔型数据就使用getBoolean()方法,读取一个字符串就使用getString()方法。这些get方法都接收两个参数,第一个参数是键,传入存储数据时使用的键值对的键值就可以得到相应的值了;第二个参数是默认值,即表示当传入的键找不到对应的值时会以什么样的默认值进行返回。示例代码如下:
SharedPreferences spf = getSharedPreferences("data",MODE_PRIVATE);String name = spf.getString("name","");int age = spf.getInt("age",0);boolean married = spf.getBoolean("married",false);
3.SQLit数据库存储
Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。既然有好东西可以直接使用,那我们自然要尝试一下了,下面我就对SQLiteOpenHelper的基本用法进行介绍。
首先你要知道SQLiteOpenHelper是一个抽象类,这意味着如果我们想要使用它的话,就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper种有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法种去实现创建,升级数据库的逻辑。
SQLiteOpenHelper种还有两个非常重要的实例方法:getReadableDatabase()和getWriteabledatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如硬盘控件已满),getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWriteableDatabase()方法则将出现异常。
SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可。这个构造方法中接收4个参数,第一个参数是Context,这个没什么好的,必须要有它才能对数据库进行操作。第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作。构建出SQLiteOpenHelper的实例之后,再调用它的getReadableDataBase()或getWriterableDatabase()方法就能够创建数据库了,数据库文件会放在/data/data//databases/目录下。此时,重写的onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。
3.1 如何创建数据库?
使用SQLiteOpenHelper创建数据库需要SQL语句方面的知识,比如:创建一个名为BookStore.db的数据库,然后在这个数据库中新建一张Book表,表中有id(主键),作者,价格,页数和书名等列。创建数据库当然还是需要用建表语句的,Book表的建表SQL语句如下所示:
create table Book( id integer primary key autoincrement, author text, price real, pages integer, name text)
只要你对SQL方面的知识稍微有一些了解,上面的建表语句对你来说应该不难吧!那么我们怎样通过代码来执行这个SQL语句呢?看下面代码:
public class MyDatabaseHelper extends SQLiteOpenHelper{ public static final String CREATE_BOOK = "create table Book(" + "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text)"; private Context mContext; public MyDatabaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version){ super(context,name,factory,version); mContext = context; } @Override public void onCreate(SQLiteDatabase db){ db.exeSQL(CREATE_BOOK);//执行创建表Book的SQL语句 Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version){ }}
光这个类是远远不够的,还需要执行一段代码,数据库才会被创建出来,代码如下:
//this -> Context,上下文//"BookStore.db" -> 数据库的名字//null -> 允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null//1 -> 当前数据库的版本号为1MyDataabaseHelper myDatabaseHelper = new MyDataabaseHelper(this,"BookStore.db",null,1);SQLiteDatabaase db = myDatabaseHelper.getWritableDatabase();//执行这里数据库才会被创建,db可用于数据库的数据添加,删除,修改,查询操作。
3.2 增加数据到数据库
增加数据比较简单,需要两个类的配合,一个是SQLiteDatabase,另外一个就是ContentValues,增加数据到数据库的代码如下所示:
//this -> Context,上下文//"BookStore.db" -> 数据库的名字//null -> 允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null//1 -> 当前数据库的版本号为1MyDataabaseHelper myDatabaseHelper = new MyDataabaseHelper(this,"BookStore.db",null,1);SQLiteDatabaase db = myDatabaseHelper.getWritableDatabase();//执行这里数据库才会被创建,db可用于数据库的数据添加,删除,修改,查询操作。 ContentValues values = new ContentValues();values.put("name","The Da Vinci Code");values.put("author","Dan Brown");values.put("pages",454);values.put("price",16.96);db.insert("Book",null,values);//添加Book表的第一条数据values.clear();//清楚缓存的数据,以便第二条数据的加入values.put("name","The Lost Symbol");values.put("author","Dan Brown");values.put("pages",510);values.put("price",19.95);db.insert("Book",null,values);//添加Book表的第二条数据
来讲讲这个SQLiteDatabaase类的insert()方法,insert方法实际上有插入的意思,就是插入数据到数据库嘛,insert方法是专门添加数据到数据库种而使用的,它接收三个参数,第一个参数是表名,我们希望向哪张表里添加数据,这里就传入该表的名字。第二个参数用于在未指定添加数据的情况下给某些为空的列自动赋值NULL,一般我们用不到这个功能,直接传入null即可。第三个参数是一个 ContentValues对象,它提供了一系列的put方法重载,用于向 ContentValues中添加数据,只需要将表中的每个列名以及相应的待添加数据传入即可。
3.3 删除数据库中的数据
删除数据更简单了,SQLiteDatabaase类提供了一个delete()的方法,这个方法呢是专门用来删除数据库中的数据而使用的,delete()接收三个参数,第一个参数是表名,第二,第三个参数是用于约束删除某一行或某几行的数据,不指定的话默认删除所有行,示例代码如下:
//this -> Context,上下文 //"BookStore.db" -> 数据库的名字 //null -> 允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null //1 -> 当前数据库的版本号为1MyDataabaseHelper myDatabaseHelper = new MyDataabaseHelper(this,"BookStore.db",null,1);SQLiteDatabaase db = myDatabaseHelper.getWritableDatabase();//执行这里数据库才会被创建,db可用于数据库的数据添加,删除,修改,查询操作。 ContentValues values = new ContentValues();values.put("name","The Da Vinci Code");values.put("author","Dan Brown");values.put("pages",454);values.put("price",16.96);db.insert("Book",null,values);//添加Book表的第一条数据
db.delete(“Book”,”pages > ?”,new String[]{“400”});//删除掉Book表中书籍页数大于400的数据
3.4 修改数据库中的数据
修改数据也叫更新数据,更新数据需要使用SQLiteDatabaase类提供了一个update()的方法,这个方法接收4个参数,第一个参数那肯定就是表名啦,第二个参数是ContentValues对象,要把更新的数据放在这里面。第三,第四参数用于约束更新某一行或者某几行中的数据,不指定的话默认就是更新所有行。示例代码如下:
//this -> Context,上下文//"BookStore.db" -> 数据库的名字//null -> 允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null//1 -> 当前数据库的版本号为1MyDataabaseHelper myDatabaseHelper = new MyDataabaseHelper(this,"BookStore.db",null,1);SQLiteDatabaase db = myDatabaseHelper.getWritableDatabase();//执行这里数据库才会被创建,db可用于数据库的数据添加,删除,修改,查询操作。 ContentValues values = new ContentValues();values.put("price",10.99);db.update("Book",values," name = ? ",new String[]{ "The Da Vinci Code" });//更新书名为"The Da Vinci Code"的price数据为10.99
3.5 查询数据库中的数据
查询数据需要使用SQLiteDatabaase类提供了一个query()的方法,这个方法的参数非常复杂,最短的一个方法也需要传入7个参数。所以请看下表:
query()方法查询出来数据后以Cursor对象返回,这个对象里面存储的就是符合查询条件的数据,要想得到所有的查询过后的数据,需要遍历Cursor对象,示例代码如下:
//this -> Context,上下文//"BookStore.db" -> 数据库的名字//null -> 允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null//1 -> 当前数据库的版本号为1MyDataabaseHelper myDatabaseHelper = new MyDataabaseHelper(this,"BookStore.db",null,1);SQLiteDatabaase db = myDatabaseHelper.getWritableDatabase();//执行这里数据库才会被创建,db可用于数据库的数据添加,删除,修改,查询操作。 Cursor cursor = db.query("Book",null,null,null,null,null,null);if(cursor.moveToFirst()){ do{ String name = cursor.getString(cursor.getColumnIndex("name"));//获取书名 String author = cursor.getString(cursor.getColumnIndex("author"));//获取作者名 int pages = cursor.getInt(cursor.getColumnIndex("pages"));//得到书的页数 double price = cuesor.getDouble(cursor.getColumnIndex("price"));//得到书籍的价格 }while(cursor.moveToNext());}cursor.close();//遍历完成后关闭Cursor对象以节约资源
3.6 如何升级数据库?
细心的你一定会发现MyDatabaseHelper类中的onUpgrade()方法啥逻辑代码也没写,这个方法就是用来升级数据库而使用的。比如:在数据库当中再建一个表Category,创建的SQL语句如下所示:
create table Category( id integer primary key autoincrement, category_name text, code integer)
接下来,我们将这条建表语句添加到MyDatabaseHelper中,代码如下所示:
public class MyDatabaseHelper extends SQLiteOpenHelper{ public static final String CREATE_BOOK = "create table Book(" + "id integer primary key autoincrement," + "author text," + "price real," + "pages integer," + "name text)"; public static final String CREATE_CATEGORY = "create table Category(" + " id integer primary key autoincrement," + " category_name text," + "code integer)"; private Context mContext; public MyDatabaseHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version){ super(context,name,factory,version); mContext = context; } @Override public void onCreate(SQLiteDatabase db){ db.exeSQL(CREATE_BOOK);//执行创建表Book的SQL语句 db.exeSQL(CREATE_CATEGORY);//创建表Category Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT).show(); } @Override public void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version){ db.exeSQL("drop table if exists Book");//删除表Book db.exeSQL("drop table if exists Category");//删除表Category onCreate(db); }}
MyDatabaseHelper类中是添加完了,但是还是需要执行一些代码,数据库才会升级:
MyDatabaseHelper myDatabaseHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);//注意这里的传入的版本号要大于旧版本,方可进行数据库升级myDatabaseHelper.getWritableDatabase();
3.7.使用LitePal操作数据库
LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)的模式,并将我们平时开发最常用的一些数据库功能进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作。LitePal的项目主页上也有详细的使用文档,地址是:https://github.com/LitePalFramework/LitePal。
配置LitePal
首先,想使用LitePal框架,第一步就是去项目下的app/build.gradle文件中,在dependencies闭包中添加如下内容:
dependemcies{ compile fileTree(dir: 'libs',include: ['*.jar']) compile 'com.android.support:appcompat-v7:23.2.0' testCompile 'junit:junit:4.12' compile 'org.litepal.android:core:1.4.1' //LitePal框架的依赖}
这样我们就把LitePal成功引入到当前项目中了,接下来需要配置litepal,xml文件。在项目app/src/main目录下新建一个名为assets目录,然后在assets目录下再新建一个litepal.xml文件,接着编辑litepal.xml文件中的内容,如下所示:
<?xml version="1.0" encoding="utf-8"?><litepal> <dbname value="BookStore" ></dbname> <version value="1"></version> <list> </list></litepal>
其中,标签用于指定数据库名,标签用于指定数据库版本号,标签用于指定所有的映射模型。最后还需要配置一下LitePalApplication,修改AndroidManifest.xml中的代码,如下所示:
...... <application android:name = "org.litepal.LitePalApplication" ............
创建和升级数据库
创建数据库:
上面讲到过了LitePal采取的是对象关系映射(ORM)的模式,简单的说就是面向对象思想和数据库关系型模式的结合,所以一个表是代表着一个类,所以你如果使用LitePal框架建一个数据库的表格的时候,你要先封装这个表对应的类,才行,比如你要建一个Book表,存在属性(int)id,(String)author,(double)price,(int)pages,(String)name,那么你应该封装的Book类的代码如下:package com.example.litepaltest;
public class Book {
private int id; //书籍IDprivate String author;//书籍作者名private double price;//书籍价格private int pages;//书籍总页数private String name;//书籍名字public int getId() { return id;}public void setId(int id) { this.id = id;}public String getAuthor() { return author;}public void setAuthor(String author) { this.author = author;}public double getPrice() { return price;}public void setPrice(double price) { this.price = price;}public int getPages() { return pages;}public void setPages(int pages) { this.pages = pages;}public String getName() { return name;}public void setName(String name) { this.name = name;}
}
接下来我们需要修改litepal.xml中的代码,代码如下:
<?xml version="1.0" encoding="utf-8"?><litepal> <dbname value="BookStore" ></dbname> <version value="1"></version> <list> <mapping class = "com.example.litepaltest.Book"></mapping> </list></litepal>
然后还需要执行一段代码,数据库即可创建,并且创建Book类对应的表Book,代码如下:
LitePal.getDatabse();
升级数据库:
使用SQLiteHelper有个弊端,就是往表里面加入一个或者多个属性,那是非常麻烦的一件事情,你必须备份好已有属性的数据,然后升级数据库后恢复到新数据库中,数据比较多的话,那就很烦人了,也可以通过SQL语句简单添加,但是跟LitePal相比较,会觉得LitePal还是简单轻松些,比如你往Book表中加入一个(String)press的属性,你直接去修改Book类中的代码,代码如下:public class Book{
…private String press;...public String getPress(){ return press; } public void setPress(String press){ this.press = press;}
}
与此同时,我们还想添加一张Category的表,那么封装一个如下的Category的类即可:
package com.example.litepaltest;public class Category { public int getId() { return id; } public void setId(int id) { this.id = id; } public String getCategoryName() { return categoryName; } public void setCategoryName(String categoryName) { this.categoryName = categoryName; } public int getCategoryCode() { return categoryCode; } public void setCategoryCode(int categoryCode) { this.categoryCode = categoryCode; } private int id; private String categoryName; private int categoryCode;}
最后修改litepal.xml中的代码再重新运行一下程序,注意version一定要改,否则是升级不了数据库的:
<?xml version="1.0" encoding="utf-8"?><litepal> <dbname value="BookStore" ></dbname> <version value="2"></version> <list> <mapping class = "com.example.litepaltest.Book"></mapping> <mapping class = "com.example.litepaltest.Category"></mapping> </list></litepal>
使用LitePal添加数据
添加数据实际上就是通过实例对象调用方法添加的,比如:往Book表中添加一条数据,怎么添加呢?首先Book当中没有可以往数据库写入数据的方法,LitePal框架提供了一个DataSupport的类,只要封装的类继承这个类,那么这个类就具有数据库的增删改查的功能,那么我们下面来讲讲如何将一条数据加入到Book表中:
首先,你得让Book表对应的封装类Book继承DataSupport,代码如下:
public class Book extends DataSupport{ ...}
然后新建一个Book实例对象,对这个实例对象进行属性值的设置,这个可以通过各种set方法完成,最后调用save()方法即可将对象当前的各属性数据写入数据库当中,示例代码如下:
Book book = new Book();book.setNmae("The Da Vinci Code");book.setAuthor("Dan Brown");book.setPages(454);book.setPrice(16.96);book.setPress("Unknow");book.save();//保存数据到数据库
使用LitePal更新数据
更新数据LitePal分为两种,即时写入式更新,一种是非即时写入式更新,下面来看看这两种更新:
即时写入式更新 :
Book book = new Book();book.setNmae("The Da Vinci Code");book.setAuthor("Dan Brown");book.setPages(454);book.setPrice(16.96);book.setPress("Unknow");book.save();//保存数据到数据库//当book对象没有回收,依然可以通过save()方法来更新book对应的Book表中的那一条数据book.setPrice(10.99);book.save();//这里的save()是更新功能,不是保存功能
非即时写入式更新 :
非即时写入式更新是数据库的常规更新功能,要使用到updateAll()方法,示例代码如下:
Book book = new Book();book.setPrice(14.95);book.setPress("Anchor");book.updateAll("name = ? and author = ?","The Da Vinci Code","Dan Brown");
不过在使用updateAll()方法的时候,还有一个非常重要的知识点是你需要知晓的,就是当你想把一个字段的值更新为默认值时,是不可以使用上面的set方式来set数据的。我们都知道,在Java中任何一种数据类型的字段都会有默认值。其实一个Book类new出一个对象时,其实所有的字段都已经被初始化为默认值了,比如说:pages字段的值就是0。因此,如果我们想把数据库表中的pages列更新成0,LitePal此时是不会对这个列进行更新的。对于所有想要将成为数据更新成默认值的操作,LitePal统一提供了一个setToDefault()方法,然后传入相应的列名就可以实现了。示例代码如下:
Book book = new Book();book.setToDefault("pages");book.updataAll();
使用LitePal删除数据
删除数据可以不通过Book实例对象,而是通过DataSupport类的静态方法deleteAll()方法完成,deleteAll()方法如果不指定约束条件,那么就默认删除表中的所有数据,deleteAll()方法第一个参数接收一个Class,这和你要删除的表对应的封装类的Class对应,第二个参数是约束条件,第三个参数是约束值。也可以通过Book实例对象的delete()方法来完成,这种就不演示了。示例代码如下:
DataSupport.deleteAll(Book.class,"price < ?","15");
使用LitePal查询数据
查询数据需要通过DataSupport类的findAll()方法来完成,findAll()返回一个List集合,集合里面就是符合条件的每一条数据对应的示例对象,findAll()接收一个参数,就是Class,比SQLiteHelper的query()方法要简单许多,示例代码如下:
List<Book> books = DaraSupport.findAll(Book.class);for(Book book:books){ ...}
还有些可能常用的方法,示例代码如下:
Book firstBook = DataSupport.findFirst(Book.class);//取Book表中的第一条数据Book lastBook = DataSupport.findLast(Book.class);//取Book表中的最后一条数据
下面来看看正规的查询手法,示例代码如下:
//执行各种方法式查询List<Book> books = DataSupport.select("name","author","pages") //选择查询的列 .where("pages > ?","400") //约束条件 .order("pages") //按照列"pages"降序排列,升序排列是asc()方法 .limit(10) //指定查询结果的数量 .offset(10) //指定查询结果的偏移量 .find(Book.class);//执行SQL语句式查询Cursor c = DataSupport.findBySQL("select * from Book where pages > ? and price < ?","400","20") if(cursor.moveToFirst()){ do{ String name = cursor.getString(cursor.getColumnIndex("name"));//获取书名 String author = cursor.getString(cursor.getColumnIndex("author"));//获取作者名 int pages = cursor.getInt(cursor.getColumnIndex("pages"));//得到书的页数 double price = cuesor.getDouble(cursor.getColumnIndex("price"));//得到书籍的价格 }while(cursor.moveToNext());}cursor.close();//遍历完成后关闭Cursor对象以节约资源
- Android本地存储总结
- android 本地存储数据
- android 本地存储
- android 本地存储
- Android本地数据存储
- Android本地存储
- Android 本地存储
- android存储本地数据大全
- Android 本地数据存储 API
- Android中的本地存储路径
- Android本地存储方案 SharedPreferences
- Android 本地数据存储 API
- Android本地数据存储: Reservoir
- Android本地数据存储: ASimpleCache
- Android本地存储目录研究
- Android数据本地安全存储
- HTML5本地存储 -Web Sql Database 总结
- HTML5本地存储 -sessionStorage localStorage 总结
- Java单元测试之JUnit篇
- 原型模式
- elasticsearch启动报错
- AutoMapper官方文档(四)【扁平化(分割)映射】
- java中实现Excel的导入与导出
- Android本地存储总结
- IO流(二)
- iOS 多线程小结
- JAVA基础——初识JAVA(一)(第一个java程序)
- Go语言报错cannot define new methods on non-local type
- Spring整合MyBatis下@Transactional无效解决方案
- 两年计划
- 博客正式开通,踏入IT之路。
- Java 十六进制(Hex)与byte数组之间的转换