android 五种数据存储 :SharePreferences、SQLite、Contert Provider、File、网络存储

Android系统提供了四种存储数据方式。分别为:SharePreference、SQLite、Content Provider和File。但由于Android系统中,数据基本是私有的,都是存放于”data/data”程序包名目录下,所以要实现数据共享,正确方式是使用Content Provider

SQLite:SQLite是一个轻量级的数据库,支持基本的SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的api

SharedPreference: 除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。

File: 即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。

ContentProvider: Android系统中能实现所有应用程序共享的一种数据存储方式,由于数据通常在各应用间的是互相私密的,所以此存储方式较少使用,但是其又是必不可少的一种存储方式。例如音频,视频,图片和通讯录,一般都可以采用此种方式进行存储。每个Content Provider都会对外提供一个公共的URI(包装成Uri对象),如果应用程序有数据需要共享时,就需要使用Content Provider为这些数据定义一个URI,然后其他的应用程序就通过Content Provider传入这个URI来对数据进行操作。

URI由3个部分组成:"content://"、数据的路径、标识ID(可选)。

1)SQLite数据存储

======================================================================

SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别为:

NULL:空值

INTEGER:整数

REAL:浮点数

TEXT:字符串

BLOB:大数据

在SQLite中,并没有专门设计BOOLEAN和DATE类型,因为BOOLEAN型可以用INTEGER的0和1代替true和false,而DATE类型则可以拥有特定格式的TEXT、REAL和INTEGER的值来代替显示,为了能方便的操作DATE类型,SQLite提供了一组函数,

详见:http://www.sqlite.org/lang_datefunc.html。这样简单的数据类型设计更加符合嵌入式设备的要求。关于SQLite的更多资料,请参看:http://www.sqlite.org/

在Android系统中提供了anroid.database.sqlite包,用于进行SQLite数据库的增,删,改,查工作,其主要方法如下:

 beginTransaction(): 开始一个事务。

 close(): 关闭连接,释放资源。

 delete(String table, String whereClause, String[] whereArgs): 根据给定条件,删除符合条件的记录。

 endTransaction(): 结束一个事务。

 execSQL(String sql): 执行给定SQL语句。

 insert(String table, String nullColumnHack, ContentValues values): 根据给定条件,插入一条记录。 

 openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory): 根据给定条件连接数据库,如果此数据库不存在,则创建。

 query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy): 执行查询。

 rawQuery(String sql, String[] selectionArgs): 根据给定SQL,执行查询。

 update(String table, ContentValues values, String whereClause, String[] whereArgs): 根据给定条件,修改符合条件的记录。

  除了上诉主要方法外,Android还提供了诸多实用的方法,总之一句话:其实Android访问数据库是一件很方便的事儿。

可以清晰的在查询结果中,红线上下的数据是完全一致的,也就是说query和rawQuery方法在的不同仅仅在于所需参数的不同。rawQuery方法需要开发者手动写出查询SQL,而query方法是由目标表名、where子句、order by子句、having子句等诸多子句由系统组成SQL语句。两方法同返回Cursor对象,所以两方在使用时孰优孰劣,就看具体情况了。本人更喜欢rawQuery的方式,因为此方式更接近传统Java开发,也可以由专业DBA来书写SQL语句,这样更符合MVC的思想,而且这样的代码可读性更高。(query方法里面参数实在太多,有点记不住谁是order by子句,谁是having子句了)

Cursor对象可以理解为游标对象,凡是对数据有所了解的人,相信对此对象都不会陌生,在这里机不再累述。只提醒一点,在第一次读取Cursor对象中的数据时,一定要先移动游标,否则此游标的位置在第一条记录之前,会引发异常。

2.案例:

http://blog.csdn.net/developer_jiangqq/article/details/7043487

======================================================================

(2)SharedPreference数据存储

======================================================================

除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:

  一、根据Context获取SharedPreferences对象

  二、利用edit()方法获取Editor对象。

  三、通过Editor对象存储key-value键值对数据。

四、通过commit()方法提交数据。

1.getSharedPreferences(String name, int mode)

得到名为‘name’的偏好文件。同时你可以更改和返回他的值。任何调用者在调用同样名字的偏好文件时只有一个实例返回,这就意味着这些调用者都可以看到其他调用者做出的更改。

name为本组件的配置文件名( 自己定义,也就是一个文件名),当这个文件不存在时,直接创建,如果已经存在,则直接使用,

mode为操作模式,默认的模式为0或MODE_PRIVATE,还可以使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE

mode指定为MODE_PRIVATE,则该配置文件只能被自己的应用程序访问。

mode指定为MODE_WORLD_READABLE,则该配置文件除了自己访问外还可以被其它应该程序读取。

mode指定为MODE_WORLD_WRITEABLE,则该配置文件除了自己访问外还可以被其它应该程序读取和写入

2,PreferenceManager的方法getSharedPreferences()

这个方法是一个普通的方法,必须有PreferenceManager的实例调用才行

3.getDefaultSharedPreferences方法

这个方法是静态的,因此可以直接调用,同时它与我们调用getSharedPreferences()方法得到的返回值是一样的,只是调用的方式不同罢了。

因为SharedPreferences背后是使用xml文件保存数据,getSharedPreferences(name,mode)方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。方法的第二个参数指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。

另外Activity还提供了另一个getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。

如果访问其他应用中的Preference,前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<package name>为cn.yang.action的应用使用下面语句创建了preference。

getSharedPreferences("TEST", Context.MODE_WORLD_READABLE);

其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :

Context otherAppsContext = createPackageContext("cn.wsl.action", Context.CONTEXT_IGNORE_SECURITY);

SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("TEST", Context.MODE_WORLD_READABLE);

String name = sharedPreferences.getString("name", "");

int age = sharedPreferences.getInt("sex", "");

如果不通过创建Context访问其他应用的preference,也可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:

File xmlFile = new File(“/data/data/<package name>/shared_prefs/itcast.xml”);//<package name>应替换成应用的包名。

具体实现代码如下:

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("SI", MODE_PRIVATE);

//存入数据

Editor editor = sp.edit();//获取编辑器

editor.putString("STRING_KEY", "string1");

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"));

}

}

这段代码执行过后,即在/data/data/com.test/shared_prefs目录下生成了一个SI.xml文件,一个应用可以创建多个这样的xml文件。如图所示:

SP.xml文件的具体内容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>

<map>

<string name="STRING_KEY">string</string>

<int name="INT_KEY" value="0" />

<boolean name="BOOLEAN_KEY" value="true" />

</map>

在程序代码中,通过getXXX方法,可以方便的获得对应Key的Value值,如果key值错误或者此key无对应value值,SharedPreferences提供了一个赋予默认值的机会,以此保证程序的健壮性。如下图运行结果中因为并无值为"NOT_EXIST"的Key,所以Log打印出的是其默认值:“none”。在访问一个不存在key值这个过程中,并无任何异常抛出。  

  SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。

2.案例说明:

private void saveflag(int flag){

SharedPreferences sp=this.getSharedPreferences("scrolltag", Context.MODE_PRIVATE);

Editor editor=sp.edit();

editor.putInt("flagtag", flag);

editor.commit();

}

private int getflag(){

SharedPreferences sharedPreferences =getSharedPreferences("scrolltag", Context.MODE_PRIVATE);

int flag=sharedPreferences.getInt("flagtag", 0);

return flag;

}

//此方法可以在任何程序中添加该段代码,来获取cn.com.shine.hotel应用中的数据了,前提是在该应用生成xml文件的时候的权限应该是 Context.MODE_WORLD_READABLE,或者是:读写

private String getScrollTextOther(){

String str=null;

Context otherAppsContext = null;

try {

otherAppsContext = createPackageContext("cn.com.shine.hotel",Context.CONTEXT_IGNORE_SECURITY);

SharedPreferences sp =otherAppsContext.getSharedPreferences("scrolltext",Context.MODE_WORLD_READABLE);

str=sp.getString("scrolltext", "");

} catch (NameNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return str;

}

======================================================================

(3)ContentProvider数据存储

======================================================================

ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制。一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制。并且此种方式忽略了底层的数据存储实现,ContentProvider提供了一种统一的通过Uri实现数据操作的方式。其步骤为:

  1. 在当前应用程序中定义一个ContentProvider。

  2. 在当前应用程序的AndroidManifest.xml中注册此ContentProvider

  3. 其他应用程序通过ContentResolver和Uri来获取此ContentProvider的数据。

 ContentResolver提供了诸如insert(), delete(), query()和update()之类的方法。用于实现对ContentProvider中数据的存取操作。

  Uri是一个通用资源标志符,将其分为A,B,C,D 4个部分:

    A:无法改变的标准前缀,包括;"content://"、"tel://"等。当前缀是"content://"时,说明通过一个Content Provider控制这些数据  

    B:URI的标识,它通过authorities属性声明,用于定义了是哪个ContentProvider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的   类名。例如;"content://com.test.data.myprovider"

    C:路径,可以近似的理解为需要操作的数据库中表的名字,如:"content://hx.android.text.myprovider/name"中的name

    D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部;

下面进行案展示:演示一下如何在应用程序之间相互获取数据:

在应用程序A中,继承ContentProvider类,并重写其中方法:

public class MyProvider extends ContentProvider{

@Override

public int delete(Uri uri, String selection, String[] selectionArgs) {

// TODO Auto-generated method stub

return 0;

}

@Override

public String getType(Uri uri) {

// TODO Auto-generated method stub

return null;

}

@Override

public Uri insert(Uri uri, ContentValues values) {

return null;

}

//在Create中初始化一个数据库

@Override

public boolean onCreate() {

SQLiteDatabase db = this.getContext().openOrCreateDatabase("test_db.db3", Context.MODE_PRIVATE, null);

db.execSQL("create table tab(_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)");

ContentValues values = new ContentValues();

values.put("name", "test");

db.insert("tab", "_id", values);

db.close();

return true;

}

//实现query方法

@Override

public Cursor query(Uri uri, String[] projection, String selection,

String[] selectionArgs, String sortOrder) {

SQLiteDatabase db = this.getContext().openOrCreateDatabase("test_db.db3", Context.MODE_PRIVATE, null);

Cursor c = db.query("tab", null, null, null, null, null,null);

return c;

}

@Override

public int update(Uri uri, ContentValues values, String selection,

String[] selectionArgs) {

// TODO Auto-generated method stub

return 0;

}

}

在其AndroidManifest.xml中声明此ContentProvider,其中authorities属性定义了此ContentProvider的Uri标识

<provider android:name=".MyProvider" android:authorities="com.test.MyProvider"/>

在应用程序B中,通过ContentResolver获取程序A的ContentProvider中的数据。

public class MainActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//获取上下文

Context ctx = MainActivity.this;

//获取ContentResolver对象

ContentResolver resolver = ctx.getContentResolver();

//获取Uri对象

Uri uri = Uri.parse("content://com.test.MyProvider");

//获取数据

Cursor c = resolver.query(uri, null, null, null, null);

c.moveToFirst();

for(int i=0; i<c.getCount(); i++){

int index = c.getColumnIndexOrThrow("name");

String src = c.getString(index);

Log.d("", src);

c.moveToNext();

}

}

}

应用程序B的运行结果如下,从此图可以发现我们在程序B中成功的获取到了程序A中的数据:

再观察两个应用程序的结构,如下图,其中红框是应用程序A的程序结构,可以清楚看到其有一个名为“test_db.db3”的数据库,蓝框是应用程序B的程序结构,其并没有任何数据库用于存储数据。由此图,可以确定应用程序B中查询出来的数据结果是来自于应用程序A。

http://www.cnblogs.com/dyllove98/archive/2013/07/17/3196821.html

http://blog.csdn.net/biaozhiyuan/article/details/7298095

 以上就是ContentProvider的使用方式,这种存储方式相比SQLite和SharedPreferences,其复杂性是显而易见的,但是在处处可见“云”的今天,程序间的数据交互需求令ContentProvider存储机制变成必不可少的一部分。

======================================================================

(4)File数据存储

======================================================================

使用File进行存储 我们有时候可以将数据直接以文件的形式保存在设备中,

例如:文本文件,图片文件等等

使用File进行存储操作主要使用到以下的

(1):public abstract FileInputStream openFileInput (String name)

这个主要是打开文件,返回FileInputStream

(2):public abstract FileOutputStream openFileOutput (String name, int mode)

这个主要是写入文件,如果该文件不存在,直接进行创建,返回FileOutputStream

Mode(主要有以下的一种的模式)

MODE_PRIVATE //私有

(3):FileInputStream(获取文件输入流)与FileOutputStream (获取文件输出流)这两类在JavaIO 操作中很常见

接下来进行操作 保存成功之后讲文件保存在当前应该程序的包名下的files/(可以改变存储的其他路径)

package com.jiangqq.file;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

public class FileAcitivy extends Activity

{

private Button bt1, bt2;

private EditText et1, et2;

private static final String FILENAME = "temp_file.txt";

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

bt1 = (Button) this.findViewById(R.id.bt1);

bt2 = (Button) this.findViewById(R.id.bt2);

et1 = (EditText) this.findViewById(R.id.et1);

et2 = (EditText) this.findViewById(R.id.et2);

bt1.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

write(et1.getText().toString());

Toast.makeText(FileAcitivy.this, "文件写入成功", Toast.LENGTH_LONG)

.show();

}

});

bt2.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

et2.setText(read());

Toast.makeText(FileAcitivy.this, "文件读出成功", Toast.LENGTH_LONG)

.show();

}

});

}

// 读文件方法

private String read() {

try {

FileInputStream inputStream = openFileInput(FILENAME);

byte[] b = new byte[inputStream.available()];

inputStream.read(b);

return new String(b);

} catch (Exception e) {

}

return null;

}

// 写文件

private void write(String content) {

try {

FileOutputStream fos = openFileOutput(FILENAME, MODE_APPEND);

fos.write(content.getBytes());

fos.close();

} catch (Exception e) {

}

}

}

2.文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。

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 ;

}

}

openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.itcast.action/files/itcast.txt ,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data/<package name>/files目录就可以看到该文件。

openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为: Context.MODE_PRIVATE    =  0

Context.MODE_APPEND    =  32768

Context.MODE_WORLD_READABLE =  1

Context.MODE_WORLD_WRITEABLE =  2

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND

Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。

MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

如果希望文件被其他应用读和写,可以传入:

openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

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 ;

}

}

对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。

Activity还提供了getCacheDir()和getFilesDir()方法:

getCacheDir()方法用于获取/data/data/<package name>/cache目录

getFilesDir()方法用于获取/data/data/<package name>/files目录

使用Activity的openFileOutput()方法保存文件,文件是存放在手机空间上,一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件,是不可行的。对于像视频这样的大文件,我们可以把它存放在SDCard。 SDCard是干什么的?你可以把它看作是移动硬盘或U盘。

在模拟器中使用SDCard,你需要先创建一张SDCard卡(当然不是真的SDCard,只是镜像文件)。创建SDCard可以在Eclipse创建模拟器时随同创建,也可以使用DOS命令进行创建,如下:

在Dos窗口中进入android SDK安装路径的tools目录,输入以下命令创建一张容量为2G的SDCard,文件后缀可以随便取,建议使用.img:

mksdcard 2048M D:\AndroidTool\sdcard.img

在程序中访问SDCard,你需要申请访问SDCard的权限。

在AndroidManifest.xml中加入访问SDCard的权限如下:

<!-- 在SDCard中创建与删除文件权限 -->

<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!-- 往SDCard写入数据权限 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。

注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){

File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录

File saveFile = new File(sdCardDir, “a.txt”);

FileOutputStream outStream = new FileOutputStream(saveFile);

outStream.write("test".getBytes());

outStream.close();

}

Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。

Environment.getExternalStorageDirectory()方法用于获取SDCard的目录,当然要获取SDCard的目录,你也可以这样写:

File sdCardDir = new File("/sdcard"); //获取SDCard目录

File saveFile = new File(sdCardDir, "itcast.txt");

//上面两句代码可以合成一句: File saveFile = new File("/sdcard/a.txt");

FileOutputStream outStream = new FileOutputStream(saveFile);

outStream.write("test".getBytes());

outStream.close();

5.网络存储:

Android提供了通过网络来实现数据的存储和获取的方法。

我们可以调用WebService返回的数据或是解析HTTP协议实现网络数据交互。

具体需要熟悉java.net.*,Android.net.*这两个包的内容,详细的类与方法的说明,请参考SDK。

下面是一个通过地区名称查询该地区的天气预报,以POST发送的方式发送请求到webservicex.net站点,访问WebService.webservicex.net站点上提供查询天气预报的服务。

代码如下:

package com.android.weather; 
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;

import android.app.Activity;
import android.os.Bundle;

public class MyAndroidWeatherActivity extends Activity {
    //定义需要获取的内容来源地址
    private static final String SERVER_URL = 
        "http://www.webservicex.net/WeatherForecast.asmx/GetWeatherByPlaceName";
    
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        HttpPost request = new HttpPost(SERVER_URL); //根据内容来源地址创建一个Http请求
        // 添加一个变量 
        List<NameValuePair> params = new ArrayList<NameValuePair>(); 
        // 设置一个地区名称
        params.add(new BasicNameValuePair("PlaceName", "NewYork"));  //添加必须的参数
        
        
        try { 
            //设置参数的编码
            request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 
            //发送请求并获取反馈
            HttpResponse httpResponse = new DefaultHttpClient().execute(request);
             
            // 解析返回的内容
            if(httpResponse.getStatusLine().getStatusCode() != 404){ 
               String result = EntityUtils.toString(httpResponse.getEntity()); 
               System.out.println(result);
            }
        } catch (Exception e) {
            e.printStackTrace();
       } 
    }
}

别忘记了在配置文件中设置访问网络权限:

<uses-permission android:name="android.permission.INTERNET" />

Android五种数据存储方式的更多相关文章

  1. [ Android 五种数据存储方式之一 ] —— SharedPreferences存储数据

    SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. 主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceS ...

  2. [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据

    Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.那这个时候有读者就会提出问题,难道两个 ...

  3. [ Android 五种数据存储方式之三 ] —— SQLite存储数据

    SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使用了 ...

  4. [ Android 五种数据存储方式之二 ] —— 文件存储数据

    关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的. 文件可用来存放大量数据,如文本.图片.音 ...

  5. Android四种数据存储方式

    一.SharedPreference数据存储篇 1.作用范围 (1).它是一种轻型的数据存储方式 (2).本质是基于XML文件存储key-value键值对数据 (3).通常用来存储一些简单的配置方式 ...

  6. Android中常用的五种数据存储方式

    第一种: 使用SharedPreferences存储数据 适用范围: 保存少量的数据,且这些数据的格式非常简单:字符串型.基本类型的值.比如应用程序的各种配置信息(如是否打开音效.是否使用震动效果.小 ...

  7. Android系统的五种数据存储形式(二)

    之前介绍了Android系统下三种数据存储形式,今天补充介绍另外两种,分别是内容提供者和网络存储.有些人可能认为内存提供者和网络存储更偏向于对数据的操作而不是数据的存储,但这两种方式确实与数据有关,所 ...

  8. Android系统的五种数据存储形式(一)

    Android系统有五种数据存储形式,分别是文件存储.SP存储.数据库存储.contentprovider 内容提供者.网络存储.其中,前四个是本地存储.存储的类型包括简单文本.窗口状态存储.音频视频 ...

  9. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...

随机推荐

  1. python 时间模块 -- time

    time 时间模块 和时间有关系的我们就要用到时间模块.在使用模块之前,应该先导入模块. # 常用方法 import time print("现在执行我") time.sleep( ...

  2. Pairs Forming LCM LightOJ - 1236 (算术基本定理)

    题意: 就是求1-n中有多少对i 和 j 的最小公倍数为n  (i <= j) 解析: 而这题,我们假设( a , b ) = n ,那么: n=pk11pk22⋯pkss, a=pd11pd2 ...

  3. day23 序列化模块

    概念: 序列化 -- 其他数据类型转换成一个字符串数据类型 反序列化 -- 字符串转换成其他数据类型 序列 -- 字符串 必须要转换成字符串的场景: 往文件里面写数据的时候只能写字符串,不能写字典的 ...

  4. Threed.sleep是不会释放锁,而wait是释放锁的(对象锁)

    实战分析 一直都说,Threed.sleep是不会释放锁,而wait是释放锁的(对象锁),现理论上来分析一下啊. v package thread.concurrent; public class D ...

  5. Leetcode 29.两数相除 By Python

    给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...

  6. [poj2528]Mayor's posters

    题目描述 The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campa ...

  7. Windows Server 2008配置Network Load Balancing(服务群集)

          最近配置SharePoint 2013 WFE 时,客户提到要让多台WFE能load balance,于是研究了下Network Load Balancing.       当把一台服务器 ...

  8. Mysql插入、替换和无视

    在现实的生产环境下,通常我们都会遇到这样的应用场景,需要我们更新数据.替换数据,若存在则不操作. insert into表示插入数据,数据库会检查主键,如果出现重复会报错: replace into表 ...

  9. 基于SpringMVC的文件(增删改查)上传、下载、更新、删除

    一.项目背景 摘要:最近一直在忙着项目的事,3个项目过去了,发现有一个共同的业务,那就是附件的处理,附件包括各种文档,当然还有图片等特殊文件,由于时间的关系,每次都是匆匆忙忙的搞定上线,称这项目的空档 ...

  10. 关于:HTTP Header -> Content-Type: text/plain Cache-Control: no-cache IE浏览器弹出错误下载对话

    下午遇到一个很奇怪的现象,一个网址: http://192.168.1.3/login?action=a&fr=b.com 注意网址后面的参数形式,action参数在前,最后一个参数值的尾部含 ...