A. 数据存储和读取该怎么实现
android应用开发中,给我们提供了5种数据的存储方式
1 使用SharedPreferences存储数据
2 文件存储数据
3 SQLite数据库存储数据
4 使用ContentProvider存储数据
5 网络存储数据
不同的业务逻辑,或者需求,用不同的实现方式,以下是这几中数据存储方式的说明用及法:
第一种: 使用SharedPreferences存储数据
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整形、Int整形、String字符串型的保存。
以下为示例代码:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取SharedPreferences对象
Context ctx = MainActivity.this;
SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);
//存入数据
Editor editor = sp.edit();
editor.putString("STRING_KEY", "string");
editor.putInt("INT_KEY", 0);
editor.putBoolean("BOOLEAN_KEY", true);
editor.commit();
//返回STRING_KEY的值
Log.d("SP", sp.getString("STRING_KEY", "none"));
//如果NOT_EXIST不存在,则返回值为"none"
Log.d("SP", sp.getString("NOT_EXIST", "none"));
}
}
第二种: 文件存储数据
关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
文件可用来存放大量数据,如文本、图片、音频等。
默认位置:/data/data/ >/files/***.***。
代码示例:
public void save(){
try {
FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE);
outStream.write(text.getText().toString().getBytes());
outStream.close();
Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
return;
}
catch (IOException e){
return ;
}
}
第三种: SQLite数据库存储数据
SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite。
SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。
SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。
读取文件示例:
public void load(){
try {
FileInputStream inStream=this.openFileInput("a.txt");
ByteArrayOutputStream stream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int length=-1;
while((length=inStream.read(buffer))!=-1) {
stream.write(buffer,0,length);
}
stream.close();
inStream.close();
text.setText(stream.toString());
Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e){
return ;
}
}
第四种 使用ContentProvider存储数据 ContentProvider其实也是通过数据库的方式来存储数据的,因此这里不再做详细介绍
第五种 网络存储数据 也就是说将数据保存在服务器,android上只需要通过httpclient发起一个请求,向服务器获取数据即可
火台,驿马,电报机,电话等。人类储存信息的工具有:牛骨﹑竹
B. 安卓无法读取文件夹怎么办
当提示“无法访问文件,建议前往安卓存储访问框架查看文件”时,通常表示该应用没有获得足够的权限来直接访问手机的文件存储。用户需要通过安卓的存储访问框架来授权访问。
1. 安卓权限系统:安卓操作系统为了保护用户的隐私和数据安全,实施了一套权限系统。应用需要用户的明确许可才能获得某些敏感权限,如访问照片、文件或摄像头等。
2. 存储访问框架(Storage Access Framework, SAF):从安卓10(API级别29)开始,Google引入了SAF作为访问外部存储(例如,SD卡或设备上的共享存储空间)的首选方法。SAF提供了一个统一的界面,让用户可以方便地浏览和选择文件,而不需要应用直接访问文件系统的权限。
3. 为什么使用SAF:使用SAF的好处是,它可以让用户更加细粒度地控制应用对文件的访问。通过SAF,用户可以选择只让应用访问特定的文件或文件夹,而不是整个外部存储。这增加了数据的安全性。
4. 如何使用SAF:当应用尝试访问文件并收到上述提示时,用户应该点击提示中的链接或按钮,这将打开SAF界面。然后,用户可以浏览到所需的文件或文件夹,并授权应用访问它。一旦授权,应用就可以读取或修改这些文件,直到用户撤销权限。
例如,假设有一个图片编辑应用想要访问用户的照片来进行编辑。如果应用没有获得直接的文件访问权限,它会提示用户使用SAF。用户随后会打开SAF,找到包含所需照片的文件夹,并授权应用访问。之后,图片编辑应用就可以读取和编辑这些照片了。
总之,当收到“无法访问文件,建议前往安卓存储访问框架查看文件”的提示时,用户需要通过SAF来授权应用访问特定的文件或文件夹。这是安卓为了保护用户隐私和数据安全而实施的一种安全措施。
C. android怎么读取sd卡中的文件
sd卡根目录是external_sd:
1.若将手机中的文件与外置SD卡互相转移,请操作:
2.若是将存储在话机中的多媒体文件移动到SD卡中:我的文件-所有文件-sdcard0-查找需要移动的文件夹-长按住不松手-移动至(若没有此菜单,请点击菜单键-移动)-返回到external_sd-点击“移动到此处”。反之亦然。
3.对于手机不支持软件搬家,是因为没有root,可以先使手机软件获得root权限,但是也有说法root容易引起手机死机,系统崩溃现象,毕竟手机root权限基本都是借助第三方软件来完成
3.有的软件都是获得了手机的root权限,可以多尝试几种软件搬家
D. Android开发之如何读写文件
【转】
首先介绍如何存储数据,显然,要将数据从应用中输出到文件中,必须得到一个输出流outPutStream,然后往输出流中写入数据,在这里Android自带了一个得到应用输出流的方法
FileOutputStream fos =context.openFileOutput(“yuchao.txt”,Context.MODE_PRIVATE); (1)
其中第一个属性为文件名,第二个属性为读写模式(有关读写模式的说明下面将详细阐述),
然后在文件输出流fos中便可以写入数据
Fos.write(“Hi,”I’m Chao Yu!”.getBytes());
用完文件输出流之后记得关闭
fos.close();
这样,在/data/data/packageName/file目录下就生成了一个文件名为yuchao.txt的文件,文件中的内容为” Hi,I’m Chao Yu!”
有关(1)中读写模式其实就是制定创建文件的权限以及在读写的时候的方式,Android中提供了以下几种读写模式
Context.MODE_PRIVATE = 0
该模式下创建的文件其他应用无权访问,并且本应用将覆盖原有的内容
Context.MODE_APPEND = 32768
该模式下创建的文件其他应用无权访问,并且本应用将在原有的内容后面追加内容
Context.MODE_WORLD_READABLE = 1
该模式下创建的文件其他应用有读的权限
Context.MODE_WORLD_WRITEABLE = 2
该模式下创建的文件其他应用有写的权限
如果需要将文件设置为外部应用可以读写,可将读写模式设置为Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE
一般情况下,各个应用维护的数据都在一个特定的文件夹中,即上面所提到的/data/data/packageName/file(存在于手机存储中),但手机内存毕竟有限,所以有些情况下,我们需要往SD卡中写入数据文件,这其实和普通的java web 应用步骤一样,都是先创建特针对特定目录特定文件的输出流,然后往输出流中写数据,这里要注意一个方法,就是获取SD卡根目录的方法,随着Android系统不断升级,SD卡的根目录随时都有可能改变,Android中得到SD卡根目录的方法是
File sdCardDir = Environment.getExternalStorageDirectory();
然后就可以进行下面的步骤
File saveFile = new File(sdCardDir, “yuchao.txt”);
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("Hi,I’m ChaoYu".getBytes());
outStream.close();
值得注意的是,在往SD卡中写数据的时候,健壮的代码必须考虑SD卡不存在或者写保护的情况,故在写入之前,先做判断
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
……
}
接着,我们来学习下我们的应用程序如何读取文件中的数据,其实就是写的逆向过程
若要读取应用程序默认维护的文件(即/data/data/packageName/file目录下的文件),首先得到文件输入流
FileInputStream istream = this.context.openFileInput(“yuchao.txt”);
然后在内存中开辟一段缓冲区
byte[] buffer = new byte[1024];
然后创建一个字节数组输出流
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
读出来的数据首先放入缓冲区,满了之后再写到字符输出流中
while((len=istream.read(buffer))!=-1){
ostream.write(buffer, 0, len);
}
最后关闭输入流和输出流
istream.close();
ostream.close();
将得到的内容以字符串的形式返回便得到了文件中的内容了,这里的流操作较多,故以一张图片来说明,见图1
return new String(ostream.toByteArray());
从SD卡中读取数据与上述两个步骤类似,故不再赘述,留给读者自己思考
如在开发过程中进行SD卡地读写,切忌忘了加入权限
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
至此,Android系统中有关文件数据的读写介绍完毕。