安卓学习之数据存储与访问.docx
- 文档编号:29053493
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:10
- 大小:18.84KB
安卓学习之数据存储与访问.docx
《安卓学习之数据存储与访问.docx》由会员分享,可在线阅读,更多相关《安卓学习之数据存储与访问.docx(10页珍藏版)》请在冰豆网上搜索。
安卓学习之数据存储与访问
SharedPreferences:
Activity之间的数据传递除了通过intent来传递外,还可以使用SharedPreferences来共享数据。
SharedPreferences是一种轻量级数据存储方式,能够实现不同应用程序间数据共享。
SharedPreferences使用键值对(Key-Value)的方式把简单数据类型(boolean、int、float、long和String)存储在应用程序的私有目录下自己定义的xml文件中。
私有目录是:
/data/data/应用程序包名/shared_prefs/
SharedPreferences编程:
(1)写入数据:
//获得SharedPreferences对象(如果不存在则新建)
SharedPreferencessp=getSharedPreferences(名称,访问模式);
//名称是:
SharedPreferences数据保存的XML文件名
//获得可编辑对象
SharedPreferences.Editoreditor=sp.edit();
editor.putString(“Name”,”abc”);//put方法写数据(key-value)
//一定要提交才能保存
mit();
(2)读取数据:
//获得SharedPreferences对象(如果不存在则新建)
SharedPreferencessp=getSharedPreferences(名称,访问模式);
Stringname=sp.getString("Name","DefaultVal");//get方法读数据
//第2个参数:
在无法获取值的时候使用的缺省值
SharedPreferences支持的三种访问模式:
⏹MODE_PRIVATE(=0,私有):
仅创建SharedPreferences的程序有权限对其进行读取或写入。
⏹MODE_WORLD_READABLE(=1,全局读):
创建程序可以对其进行读取或写入,其它应用程序只具有读取操作的权限,但没有写入操作的权限。
⏹MODE_WORLD_WRITEABLE(=2,全局写):
所有程序都可以对其进行写入操作,但没有读取操作的权限。
SQLite数据库:
Android在运行时(run-time)集成了SQLite,所以每个Android应用程序都可以使用SQLite数据库。
SQLite特点:
⏹SQLite是一款开源的、轻量级的、嵌入式的、关系型数据库。
⏹普通数据库的管理系统比较庞大和复杂,会占用了较多的系统资源,轻量级数据库SQLite的特点:
⏹比传统数据库更适合用于嵌入式系统
⏹占用资源少,运行高效可靠,可移植性强
⏹提供了零配置(zero-configuration)运行模式
数据库存储在:
/data/data/应用程序包名/databases/
在Android中,某个应用程序创建的数据库只有它自己可以访问,其它应用程序是不能访问的。
创建数据库和表:
⏹Android提供了一个名为SQLiteOpenHelper的辅助类来管理数据库的创建和版本。
可以通过继承这个类,实现它的一些方法来对数据库进行一些操作。
⏹创建数据库辅助类:
⏹当前项目src某包上->右键->New->class->输入class名(例如DBOpenHelper),并继承SQLiteOpenHelper类,然后修改相关代码。
onCreate():
//数据库第一次被创建时将调用onCreate()
//通常将创建表的操作放在这里
onUpgrade():
//当数据库版本发生变化时会调用onUpgrade()
//这里可写更新数据表的操作(谨慎使用),也可空着不写
为辅助类添加构造函数和创建数据表代码:
在SQLiteOpenHelper的子类当中,必须定义一个构造函数,该构造函数含四个参数:
上下文对象、数据库名字、游标工厂和数据库版本号(值必须是整数并且是递增的状态,但不要设置为0,如果为0则会每次都创建数据库)。
在Activity中使用辅助类来创建好打开数据库:
在Activity类中定义1个成员(版本号)
关于getWritableDatabase、getReadableDatabase:
当用户调用getWritableDatabase或getReadableDatabase时:
1、如果数据库不存在,就会调用onCreate(),不会调用onUpgrade();
2、如果数据库存在,但是版本不一样,就调用onUpgrade(),不会调用onCreate();
3、如果数据库存在,版本一样,不会调用onCreate()和onUpgrade(),此时如果数据库没有打开,就调用onOpen()方法打开,如果打开了就不调用onOpen().
getWritableDatabase():
打开一个可以读写的数据库
getReadableDatabase():
打开一个只读的数据库
test.db
test.db-journal是数据库日志文件
不使用辅助类来创建数据库和表的方法:
//打开或创建test.db数据库
SQLiteDatabasedb=openOrCreateDatabase("test.db",Context.MODE_PRIVATE,null);//每个数据库都只能被创建它的包访问,所以不能将数据库设为WORLD_READABLE
//CursorFactory一般设置为空
db.execSQL("DROPTABLEIFEXISTSperson");
//创建person表
db.execSQL("CREATETABLEperson(idINTEGERPRIMARYKEYAUTOINCREMENT,nameVARCHAR,ageSMALLINT)");
SQLite编程1:
1、SQLiteDatabase.execSQL():
执行insert、delete、update和createtable等有更改行为的SQL语句
2、SQLiteDatabase.rawQuery():
执行select语句
publicvoidinsert(Personperson){
DBOpenHelperhelper=newDBOpenHelper(getApplicationContext(),"test.db",null,DB_VERSION);
SQLiteDatabasedb=helper.getWritableDatabase();
db.execSQL("INSERTINTOpersonVALUES(NULL,?
?
)",
newObject[]{person.name,person.age});
db.close();
Toast.makeText(getApplicationContext(),"记录添加成功",Toast.LENGTH_SHORT).show();
}
publicvoiddeleteById(intid){
DBOpenHelperhelper=newDBOpenHelper(getApplicationContext(),"test.db",null,DB_VERSION);
SQLiteDatabasedb=helper.getWritableDatabase();
db.execSQL("Deletefrompersonwhereid=?
",newObject[]{id});
db.close();
Toast.makeText(getApplicationContext(),"记录删除成功",Toast.LENGTH_SHORT).show();
}
publicvoiddeleteAll(){
DBOpenHelperhelper=newDBOpenHelper(getApplicationContext(),"test.db",null,DB_VERSION);
SQLiteDatabasedb=helper.getWritableDatabase();
db.execSQL("Deletefromperson",newObject[]{});
db.close();
Toast.makeText(getApplicationContext(),"数据表全部清空",Toast.LENGTH_SHORT).show();
}
publicvoidupdateById(intid,Personperson){
DBOpenHelperhelper=newDBOpenHelper(getApplicationContext(),"test.db",null,DB_VERSION);
SQLiteDatabasedb=helper.getWritableDatabase();
db.execSQL("Updatepersonsetname=?
age=?
whereid=?
",newObject[]{person.name,person.age,id});
db.close();
Toast.makeText(getApplicationContext(),"记录修改成功",Toast.LENGTH_SHORT).show();
}
查询数据:
DBOpenHelperhelper=newDBOpenHelper(getApplicationContext(),"test.db",null,DB_VERSION);
SQLiteDatabasedb=helper.getWritableDatabase();
Cursorcursor=db.rawQuery("SELECT*FROMpersonwhereage>?
",newString[]{"10"});
//rawQuery()原生查询返回值是Cursor游标(结果集)
TextViewtv=(TextView)findViewById(R.id.textView1);
tv.setText("查询到"+cursor.getCount()+"条记录(当前数据库版本号="+DB_VERSION+")");
while(cursor.moveToNext()){
//根据列号取值
intid=cursor.getInt(cursor.getColumnIndex("id"));
Stringname=cursor.getString(cursor.getColumnIndex("name"));
intage=cursor.getInt(cursor.getColumnIndex("age"));
tv.setText(tv.getText()+"\n"+"id="+id+",name="+name+",age="+age);
}
cursor.close();//关闭cursor
db.close();//关闭数据库连接
Cursor游标的一些重要操作:
Cursor.move(intoffset);//以当前位置为参考,移动到指定行
Cursor.moveToFirst();//移动到第一行
Cursor.moveToLast();//移动到最后一行
Cursor.moveToPosition(intposition);//移动到指定行
Cursor.moveToPrevious();//移动到前一行
Cursor.moveToNext();//移动到下一行
Cursor.isFirst();//是否指向第一条
Cursor.isLast();//是否指向最后一条
Cursor.isNull(intcolumnIndex);//指定列是否为空(列基数为0)
Cursor.isClosed();//游标是否已关闭
Cursor.getCount();//总数据项数
Cursor.getPosition();//返回当前游标所指向的行数
Cursor.getColumnIndex(StringcolumnName);//返回某列名对应的列索引值
Cursor.getString(intcolumnIndex);//返回当前行指定列的值
更新数据库(谨慎使用):
Buttonbt6=(Button)findViewById(R.id.button6);
bt6.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewarg0){
DB_VERSION++;
//更新test.db数据库,其中数据库新版本号=老版本+1
DBOpenHelperhelper=newDBOpenHelper(getApplicationContext(),"test.db",null,DB_VERSION);
//触发DBOpenHelper类的onUpgrade方法
SQLiteDatabasedb=helper.getWritableDatabase();
db.close();
}
});
SQLite编程2:
⏹SQLiteDatabase类自身提供了insert()、delete()、update()、query()四个方法对数据库进行操作;
⏹这些方法封装了部分SQL语句,通过参数进行拼接。
添加数据:
Personperson2=newPerson("Tom",18);
//ContentValues以键值对的形式存放基本类型的数据
ContentValuescv=newContentValues();
cv.put("name",person2.name);
cv.put("age",person2.age);
DBOpenHelperhelper=newDBOpenHelper(getApplicationContext(),"test.db",null,1);
SQLiteDatabasedb=helper.getWritableDatabase();
//将ContentValues对象添加到数据表中
db.insert("person",null,cv);//第二个参数一般设置为null
db.close();
删除数据:
intcount=db.delete("person","age
andname=?
",
newString[]{"40","Tom"});
//SQLite是弱类型,会自动将String转换为int
db.close();
Toast.makeText(getApplicationContext(),count+"条记录删除成功",Toast.LENGTH_SHORT).show();
更新数据:
ContentValuescv=newContentValues();
cv.put("age",35);
//用ContentValues中的数据更新记录
intcount=db.update("person",cv,"name=?
",newString[]{"Tom"});
//第三个参数是条件语句
db.close();
Toast.makeText(getApplicationContext(),count+"条记录修改成功",Toast.LENGTH_SHORT).show();
查询数据:
Query()方法说明:
publicCursorquery(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit)
参数分别代表:
表名,字段名,where条件,where条件值,分组,提供分组后关于组的一个或多个限定条件,排序,强制select语句返回指定的记录数
示例:
Cursorcursor=db.query("person",newString[]{"id","name"},
"id>?
",newString[]{"10"},null,null,"iddesc","1,3");
Select"id","name“Fromperson
Whereid>10Orderbyiddesc
Limit1,3
查询数据:
DBOpenHelperhelper=newDBOpenHelper(getApplicationContext(),"test.db",null,DB_VERSION);
SQLiteDatabasedb=helper.getWritableDatabase();
TextViewtv=(TextView)findViewById(R.id.textView1);
Cursorcursor=db.query("person",newString[]{"id","name"},
"id>?
",newString[]{"10"},null,null,"iddesc","1,3");
if(cursor.getCount()==0)
tv.setText("查询到0条记录(当前数据库版本号="+db.getVersion()+")");
else
tv.setText("查询到"+cursor.getCount()+"条记录(当前数据库版本号="+db.getVersion()+")");
while(cursor.moveToNext()){
intid=cursor.getInt(cursor.getColumnIndex("id"));
Stringname=cursor.getString(cursor.getColumnIndex("name"));
tv.setText(tv.getText()+"\n"+"id="+id+",name="+name);
}
cursor.close();//关闭cursor
db.close();//关闭数据库连接
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学习 数据 存储 访问