关于Android开发数据存储的四大方式
在厦门做Android开发也有两个月了,快情人节了,我还在弄代码。在微信平台上开发自己的APP,用到了数据存储的知识,现在总结一下:
总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络。其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式;数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等;网络,则用于比较重要的事情,比如科研,勘探,航空等实时采集到的数据需要马上通过网络传输到数据处理中心进行存储并进行处理。
对于Android平台来讲,它的存储方式也不外乎这几种,按方式总体来分,也是文件,数据库和网络。但从开发者的角度来讲它可以分为以下五种方式:
1.SharedPreferences共享偏好
2.Internal Storage内部存储空间
3.External Storage外部存储空间
4.SQLite Database数据库
5.Internet网络
这几种方式各自有各自的优点和缺点,要根据不同的实际情况来选择,而无法给出统一的标准。下面就各种方式谈谈它们的优缺点,以及最合适的使用情况:
下面根据自己在开发中,分别做一下测试,先做一下简单的APP,帮组自己理解Android的数据存储:
(一)文件
其实这个APP 也是在网上下载的,效果如图:
实现的功能:将网络上的一张图片下载到自己的收集里面。
现在就贴一下代码吧:1.MainActivity.java
package
com.test.learning;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class CopyOfMainActivity extends Activity implements Runnable {
private EditText urlText;
private Button button;
private Handler handler; // 声明一个Handler对象
private boolean flag = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
urlText = (EditText) findViewById(R.id.editText_url);
button = (Button) findViewById(R.id.button_go);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Thread t = new Thread(CopyOfMainActivity.this);
t.start(); // 开启线程
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (flag) {
Toast.makeText(CopyOfMainActivity.this, "文件下载完成!",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(CopyOfMainActivity.this, "文件下载失败!",
Toast.LENGTH_SHORT).show();
}
super.handleMessage(msg);
}
};
}
});
}
@Override
public void run() {
try {
String sourceUrl = urlText.getText().toString();
URL url = new URL(sourceUrl);
HttpURLConnection urlConn = (HttpURLConnection) url
.openConnection();
InputStream is = urlConn.getInputStream(); // 获取输入流对象
if (is != null) {
String expandName = sourceUrl.substring(
sourceUrl.lastIndexOf(".") + 1, sourceUrl.length())
.toLowerCase();
String fileName = sourceUrl.substring(
sourceUrl.lastIndexOf("/") + 1,
sourceUrl.lastIndexOf("."));
File file = new File("/sdcard/pictures/" + fileName + "."
+ expandName);
FileOutputStream fos = new FileOutputStream(file);
byte buf[] = new byte[128];
while (true) {
int numread = is.read(buf);
if (numread <= 0) {
break;
} else {
fos.write(buf, 0, numread);
}
}
}
is.close(); // 关闭输入流对象
urlConn.disconnect();
flag = true;
} catch (MalformedURLException e) {
e.printStackTrace();
flag = false;
} catch (IOException e) {
e.printStackTrace();
flag = false;
}
Message m = handler.obtainMessage(); // 获取一个Message
handler.sendMessage(m); // 发送消息
}
}
2.main.xml代码
<?xml
version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:background="@drawable/background"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText
android:layout_weight="1"
android:id="@+id/editText_url"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:text="@string/defaultvalue"
android:lines="1" />
<Button
android:id="@+id/button_go"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/go" />
</LinearLayout>
3.string.xml代码
<?xml
version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">14.5</string>
<string name="go">下载</string>
<string name="defaultvalue">http://p8.qhimg.com/dm/620_270_/t011685779b50979038.jpg</string>
</resources>
运行就可以得到如上的图。