shell数组⾥追加数值_shell数组追加数据库
Android平台进⾏数据存储的五⼤⽅式,分别如下:
1 使⽤SharedPreferences存储数据
2 ⽂件存储数据
3 SQLite数据库存储数据
4 使⽤ContentProvider存储数据
5 ⽹络存储数据
下⾯详细讲解这五种⽅式的特点
第⼀种: 使⽤SharedPreferences存储数据
适⽤范围:保存少量的数据,且这些数据的格式⾮常简单:字符串型、基本类型的值。⽐如应⽤程序的各种配置信息(如是否打开⾳效、是否使⽤震动效果、⼩游戏的玩家积分等),解锁⼝ 令密码等
核⼼原理:保存基于XML⽂件存储的key-value键值对数据,通常⽤来存储⼀些简单的配置信息。通过DDMS的File Explorer⾯板,展开⽂件浏览树,很明显SharedPreferences数据总是存储在/data/data//shared_prefs⽬录下。SharedPreferences对象本⾝只能获取数据⽽不⽀持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接⼝Editor对象实现。 SharedPreferences本⾝是⼀ 个接⼝,程序⽆法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)⽅法来获取SharedPreferences实例,该⽅法中name表⽰要操作的xml⽂件名,第⼆个参数具体如下:
Context.MODE_PRIVATE: 指定该SharedPreferences数据只能被本应⽤程序读、写。
Context.MODE_WORLD_READABLE: 指定该SharedPreferences数据能被其他应⽤程序读,但不能写。
Context.MODE_WORLD_WRITEABLE: 指定该SharedPreferences数据能被其他应⽤程序读,写
Editor有如下主要重要⽅法:
SharedPreferences.Editor clear():清空SharedPreferences⾥所有数据
SharedPreferences.Editor putXxx(String key , xxx value): 向SharedPreferences存⼊指定key对应的
数据,其中xxx 可以是boolean,float,int等各种基本类型据
SharedPreferences.Editor remove(): 删除SharedPreferences中指定key对应的数据项
boolean commit(): 当Editor编辑完成后,使⽤该⽅法提交修改
实际案例:运⾏界⾯如下
这⾥只提供了两个按钮和⼀个输⼊⽂本框,布局简单,故在此不给出界⾯布局⽂件了,程序核⼼代码如下:
、class ViewOcl implements View.OnClickListener{
@Override
public void onClick(View v) {
Id()){
case R.id.btnSet:
//步骤1:获取输⼊值
String code = Text().toString().trim();
//步骤2-1:创建⼀个SharedPreferences.Editor接⼝对象,lock表⽰要写⼊的XML⽂件名,MODE_WORLD_WRITEABLE写操作
SharedPreferences.Editor editor = getSharedPreferences("lock", MODE_WORLD_WRITEABLE).edit();
//步骤2-2:将获取过来的值放⼊⽂件
editor.putString("code", code);
//步骤3:提交
editormit();
Toast.makeText(getApplicationContext(), "⼝令设置成功", Toast.LENGTH_LONG).show();
break;
case R.id.btnGet:
//步骤1:创建⼀个SharedPreferences接⼝对象
SharedPreferences read = getSharedPreferences("lock", MODE_WORLD_READABLE);
//步骤2:获取⽂件中的值
String value = String("code", "");
Toast.makeText(getApplicationContext(), "⼝令为:"+value, Toast.LENGTH_LONG).show();
break;
}
}
}
、读写其他应⽤的SharedPreferences: 步骤如下
1、在创建SharedPreferences时,指定MODE_WORLD_READABLE模式,表明该SharedPreferences数据可以被其他程序读取
2、创建其他应⽤程序对应的Context:
Context pvCount = createPackageContext("app", Context.CONTEXT_IGNORE_SECURITY);这⾥的app就是其他程序的包名
3、使⽤其他程序的Context获取对应的SharedPreferences
SharedPreferences read = SharedPreferences("lock", Context.MODE_WORLD_READABLE);
4、如果是写⼊数据,使⽤Editor接⼝即可,所有其他操作均和前⾯⼀致。
SharedPreferences对象与SQLite数据库相⽐,免去了创建数据库,创建表,写SQL语句等诸多操作,相对⽽⾔更加⽅便,简洁。但是SharedPreferences也有其⾃⾝缺陷,⽐如其职能存储boolean,int,float,long和String五种简单的数据类型,⽐如其⽆法进⾏条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储⽅式的⼀种补充,⽽⽆法完全替代如SQLite数据库这样的其他数据存储⽅式。
第⼆种: ⽂件存储数据
核⼼原理: Context提供了两个⽅法来打开数据⽂件⾥的⽂件IO流 FileInputStream openFileInput(String name);
FileOutputStream(String name , int mode),这两个⽅法第⼀个参数 ⽤于指定⽂件名,第⼆个参数指定打开⽂件的模式。具体有以下值可选:
MODE_PRIVATE:为默认操作模式,代表该⽂件是私有数据,只能被应⽤本⾝访问,在该模式下,写⼊的内容会覆盖原⽂件的内容,如果想把新写⼊的内容追加到原⽂件中。可 以使⽤Context.MODE_APPEND
MODE_APPEND:模式会检查⽂件是否存在,存在就往⽂件追加内容,否则就创建新⽂件。
MODE_WORLD_READABLE:表⽰当前⽂件可以被其他应⽤读取;
MODE_WORLD_WRITEABLE:表⽰当前⽂件可以被其他应⽤写⼊。
除此之外,Context还提供了如下⼏个重要的⽅法:
getDir(String name , int mode):在应⽤程序的数据⽂件夹下获取或者创建name对应的⼦⽬录File getFilesDir():获取该应⽤程序的数据⽂件夹得绝对路径
String[] fileList():返回该应⽤数据⽂件夹的全部⽂件
public String read() {
try {
FileInputStream inStream = this.openFileInput("");
byte[] buffer = new byte[1024];
int hasRead = 0;
StringBuilder sb = new StringBuilder();
while ((hasRead = ad(buffer)) != -1) {
sb.append(new String(buffer, 0, hasRead));
}
inStream.close();
String();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void write(String msg){
// 步骤1:获取输⼊值
if(msg == null) return;
try {
// 步骤2:创建⼀个FileOutputStream对象,MODE_APPEND追加模式
FileOutputStream fos = openFileOutput("",
MODE_APPEND);
// 步骤3:将获取过来的值放⼊⽂件
fos.Bytes());
// 步骤4:关闭数据流
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
openFileOutput()⽅法的第⼀参数⽤于指定⽂件名称,不能包含路径分隔符“/” ,如果⽂件不存在,Android 会⾃动创建它。创建的⽂件保存在/data/data//files⽬录,如: /data/app/,
下⾯讲解某些特殊⽂件读写需要注意的地⽅:
mkdirs方法读写sdcard上的⽂件
其中读写步骤按如下进⾏:
1、调⽤Environment的getExternalStorageState()⽅法判断⼿机上是否插了sd卡,且应⽤程序具有读写SD卡的权限,如下代码将返回true
2、调⽤ExternalStorageDirectory()⽅法来获取外部存储器,也就是SD卡的⽬录,或者使⽤"/mnt/sdcard/"⽬录
3、使⽤IO流操作SD卡上的⽂件
注意点:⼿机应该已插⼊SD卡,对于模拟器⽽⾔,可通过mksdcard命令来创建虚拟存储卡
必须在l上配置读写SD卡的权限
// ⽂件写操作函数
private void write(String content) {
if (ExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { // 如果sdcard存在
File file = new ExternalStorageDirectory()
.toString()
+ File.separator
+ DIR
+ File.separator
+ FILENAME); // 定义File类对象
if (!ParentFile().exists()) { // ⽗⽂件夹不存在
}
PrintStream out = null; // 打印流对象⽤于输出
try {
out = new PrintStream(new FileOutputStream(file, true)); // 追加⽂件
out.println(content);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close(); // 关闭打印流
}
} else { // SDCard不存在,使⽤Toast提⽰⽤户
Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show(); }
}
// ⽂件读操作函数
private String read() {
if (ExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) { // 如果sdcard存在
File file = new ExternalStorageDirectory()
.toString()
+ File.separator
+ DIR
+ File.separator
+ FILENAME); // 定义File类对象
if (!ParentFile().exists()) { // ⽗⽂件夹不存在
}
Scanner scan = null; // 扫描输⼊
StringBuilder sb = new StringBuilder();
try {
scan = new Scanner(new FileInputStream(file)); // 实例化Scanner
while (scan.hasNext()) { // 循环读取
sb.() + "\n"); // 设置⽂本
}
String();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (scan != null) {
scan.close(); // 关闭打印流
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论