这只是我在学Android过程中对于所学知识的巩固和方便日后查询的学习笔记,能帮助到有需要的和我一样的初学者就更好了
数据的保存可有文件、SharedPreference、数据库等形式
文件
文件形式类似于最基本的I/O流
Context类提供了openFileOutput(String name,int MODE)方法来获取FileOutputStream对象,此方法有两个参数:
1、文件名 2、储存模式 MODE_APPEND为追加;MODE_PRIVATE为覆盖
借助BufferedWriter对象即可实现写入
同样的也有OpenFileInput(String name)来获取FileInputStream对象
借助BufferedReader即可实现读取
SharedPreferences
使用键值对的形式来保存数据,通过键即可读取值,适合保存一些常用的数据(比如天气软件中可将申请天气所用的各类id在获取时及时保存到SharedPreferences中在启动时直接提取然后自动申请最新数据)
首先获取SharedPreferences对象
有三种方法获取
SharedPreferences pref
=PreferencesManager.getDefaultSharedPreferences(Context context);
=getSharedPreferences(String name ,int MODE); //Context类
=getPreference(int MODE);//Activity类
//后两者可直接传入0,因为目前只有此一中模式可选
然后分为三部实现写入
1、调用SharedPreferences对象的edit()方法获取SharedPreferences.Editor对象editor
2、根据所需数据类型添加数据:
editor.putString(String key,String data);
editor.putBoolean(String key,Boolean data);
3、调用apply()完成数据提交
editor.apply();
Sharedpreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","James");
editor.putInt("age",18);
editor.putBoolean("married",false);
editor.apply();
读取SharedPreferences
1、获取SharedPreferences对象 prefs
2、调用prefs的get方法即可(注意对应值的类型)
SharedPreference prefs
=PraferencesManager.getDefaultSharedPreferences(this);
String name=prefs.getString("name",null)
//参数1为键,参数2为找不到对应值是返回的默认值
int age=prefs.getInt("age",0);
boolean marride=prefs.getBoolean("marride",false);
SQLite
Android自带的轻量级数据库,可使用android的方式也可使用SQL原生语句
使用起来并不复杂
首先
新建MyHelper继承SQLiteDatabaseHelper这个抽象类,并在其中完成建表、初始化等一系列工作
public class MyHelper extends SQLiteDatabaseHelper{
public static final String CREATE_BOOK="create table Book("
+"id integer primary key autoincrement,"
+"author text,"
+"pages integer,"
+"price real,"
+"name text )"
//SQL建表语句,支持类型integet(int),text(String),real(实数)等等
private Context mcontext;
public MyHelper(Context context ,String name ,
SQLiteDatabase.CursorFactory factory ,int version){
super(context ,name ,factory ,version);
mcontext=context;
}
public void onCreate(SQLiteDatabase db){ //创建上边所建的表单
db.execSQL(CREATE_BOOK);
}
public void onUpgrade(SQLiteDatabase db,int oldversion,int newversion){
//此方法在升级版本是从才会得到执行
}
}
升级数据库
若想再在次数据库中添加新的表单
要注意创建后onCreate()就不再执行,
其次
使用时
1、获得MyHelper对象,
MyHelper helper=new MyHelper(getContex() ,"library" ,null ,1);
//context对象、数据库名字、null即可、版本号
2、
SQLiteDatabase db=helper.getReadableDatabse();
=helper.getWritableDatabase();
//根据自己的需求选取
数据库升级
若想在已建立的数据库中新加表单的话,在MyHelper中新增表单是无效的,因为建立后onCreate()便不再执行,但是升级版本号onUpgrade()会执行,在此中清除表单再调用onCreate()才行。
public static final String CREATE _MAGEZINE="create table Magezine("
+"id integer primary key autoincrement,"
+"name text,"
+"pages integer,"
+"price real)"
public onCreate(SQLiteDatabase db){
db.execSQL("CREATE_BOOK");
db.execSQL("CREATE_MAGEZINE");
}
public onUpgrade(SQLiteDatabse db ,int oldversion, int newversion){
db.execSQL("drop table if exists Book"); //删除之前的Book表
onCreate(db);//重新调用onCreate()
}
helper=new MyHelper(getContext ,"library" ,null ,2);
//版本修改为比之前的大的数就可以使onUpgrade()执行
增
insert(String tablename ,null ,ContentValues values)
SQLiteDatabase db=myhelper.getWritableDatabase();
ContentValues values=new ContentValues();//数据的载体
values.put("name","十万个为什么");
values.put("pages",525);
values.put("price",98.55);
db.insert("Book" ,null ,values);
values.clear();
查
query(table ,colunm ,selection ,selectionArgs ,groupBy ,having ,orderBy)
表名、列名、列约束条件、为约束条件赋值、组、包含有、结果的排序方式
SQLiteDatabse db=myhelper.getReadableDatabse();
Cursor cursor=db.query("Book", null,"pages>?",new String[]{500},null,null,null);
//Book表中pages列数值大于500的结果保存在Cursor对象中
if(cursor.moveTofirst()){
do{
String name=cursor.getString(cursor.getcolumnIndex(""name));
}while(cursor.moveToNext());
}
//cursor的游标在查询结果第一值的前一位moveTofirst为true表示有结果
//最后一个记过读完后moveToNext()自然是返回false从而停止循环
cursor.close();
删
delete(name , 约束)
SQLiteDatabse db=new MyDatabseHelper();
db.delete("Book" ,"pages>?" ,new String[]{"500"});
//删除页数大于500的
改
update(name ,values ,约束)
SQLiteDatabse db=myhelper.getWritableDatabse();
ContentValues calues=new ContentValues();
values.put("name","十万个冷笑话");
db.update("Book",values,"name=?",new String[]{"十万个为什么"});
注意
1、SQLite的升级过于强硬,drop后表中的数据将全部丢失,所以一定要做好备份;
2、CRUD时一定要做好约束,否则会将虽有的数据都修改了;
开源的LitePal很好用,升级时自动保存之前的数据还能新增表单,很省事
LitePal
首先
添加依赖
compile'org.litepal.android:core:1.4.1'
其次
创建表单的类
LitePal中表就是实体类继承DataSupport类并添加所需属性
public class Book extends DataSupport{
private int id;//id为必有的
private String name;
private int pages;
private double price;
private String author;
GETTER ;SETTER;
}
public class Magezine extends DataSupport{
......
}
再者
配置xml文件
app/src/main→New→Directory→assets
assets→litepal.xml
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="Library" /> //数据库名
<version value="1" /> //版本
<list>
<mapping class="PackageName.Book"/>//表的实体类
<mapping class="PackageName.Magezine"/>
</list>
</litepal>
然后
AndroidManifest.xml中<application标签中初始化
android:nane="org.litepal.LitePalApplication"
//为了让litepal获取contex()
最后
使用
增
Book book=new Book();
book.setName("十万个为什么");
book.setprice(98.55);
book.setpages(525);
book.save();
查
List<Book> booklist=DataSupport.findAll(Book.class);
//查找Book表中所有元素
Book book=DataSupport.findFirst(Book.class);
//Book表中第一个元素
List<Book> booklist=DataSupport.select("name" ,"author" ,"pages")
.where("pages>?","500")
.order("pages") //desc降序
.limit(10) //向后查的量
.offset(10) //偏移量
.find(Bool.class);
/*从表Book中查寻第十个元素到第二十个元素之间页数大于500的元素的name、author、pages三项数据并将结果以pages为基准做升序排列
*/
删
DataSupport.deleteAll(String tablename ,String seletion ,String seletionArgs)
DataSupport.deleteAll(Book.class ,"pages>?" ,"500");
改
Book book=new Book();
book.setName("十万个冷笑话");
book.updateAll("name=?and pages>?" ,"十万个为什么" ,"500");
升级
1、新建一个所需表的实体类
2、在assets.xml中的<litepal>的<mapping>中加入
例如<mapping class="PackageName.Student"/>
3、修改assets中version为比之前大的数字即可完成升级,不但创建了新表,之前的表及其数据也都得到了保留