首页必赢亚洲bwin188 › 迅猛了然多少存储必赢亚洲bwin188

迅猛了然多少存储必赢亚洲bwin188

数码存储

Andoid中的数据存储和我们一直观察的不平等,或者说移动设备的积存和常常不均等。Andoid中的存储形式有五种,
单把囤积拎出来,是因为我们延续的开发会平时应用,重要性可想而知,多样的存储模式让我们挑选时更是灵敏,但每种模式都有分其它施用场景,不可相互替代,请看:

方式一:Shared Preferences

您可以叫它用户偏好参数,顾名思义,就是用来囤积一些用户的自定义设置,或任何“微型"用户数量

等等,好像忘了一件事,很重要,很首要!
下面请按自己说的做:

  1. 拿出您的Android手机

  2. 打开R.E管理器(什么?没有,还不快戳我

  3. 查阅文件

             
即便通常翻看文件的同窗肯定发现了这样一个奇怪的景观

                 必赢亚洲bwin188 1

 

                  这六个路子里的公文竟然一模一样,搞毛啊!

 

                  其实真相是如此的

                必赢亚洲bwin188 2

 
 这么些定义一定要显明,接着重返根目录,在/data/data/<包名>/...中(随便打开一个包),会看到有/lib,/shared_prefs,/files,等多少个公文夹,大家的sharedPreferencesfan形式所蕴藏的公文地方就在/shared_prefs中,读写例子咱们就融洽找呢,对不住了!

这中间涉及的那个公文夹会平常使用,我们自然要熟识!

艺术二:文件存储

这里的文件存储其实又可以分成二种

积存到系统默认地方

先看代码

/*name 文件名,只是名字,不包含路径,如love
/*content 内容
public void save(String name, String content) {
        try {
            FileOutputStream outputStream = context.openFileOutput(name,Context.MODE_WORLD_WRITEABLE + Context.MODE_WORLD_READABLE);
            outputStream.write(content.getBytes());
            outputStream.close();

        } catch (Exception e) {
            // TODO: handle exception
        }

    }

留意看代码中的注释,指定了文件名后,会默认存储到前边的/data/data/<包名>/files/<name>,格式默认xml,即是k/v的款型。

积存到自定义地点

public void saveToSdcard(String filename,String content) throws Exception{
        File file=new File("/storage/sdcard0",filename);
        FileOutputStream outputStream=new FileOutputStream(file);
        outputStream.write(content.getBytes());
        outputStream.close();

    }

可以指定文件地方,相比较灵敏,但个体提议如故听从Android的预约,即接纳默认存储地点,便于管理维护,结构也相比明晰。

格局三:SqlLite数据库存储

SqlLite简介,请走此通道,Android中内嵌了SqlLite,所以使用安排时不用安装数据库什么的了。

SqlLite场景适合于那一个数据相比较庞大,复杂的数码存储,并且也有有关的Gui。

先看段代码:

public class DbOpenHeler extends SQLiteOpenHelper {// 需手动实现一下构造方法

    public DbOpenHeler(Context contet) {

        super(contet, "itcast.db", null, 3);//传入版本号
    }

    public DbOpenHeler(Context context, String name, CursorFactory factory,
            int version) {
        super(context, "itcast.db", null, 1);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 第一次创建时会执行
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE person(personId integer primary key autoincrement,name varchar(20))");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub//当版本号不一样时即升级时会执行
        //db.execSQL("ALTER TABLE person ADD phone varchar(20) null");
        db.execSQL("ALTER TABLE person ADD amount integer");
    }

}

见状OnCreate和OnUpgrade了吧,这两个方法必须给落实了。

OnCreate()在伊始化你自定义的数据库时会调用,你不可以不给它指定一个本子号,用来标识。

OnUpgrade()的职能是:当大家是因为需要需要修改数据库或升官数据库时,只需在构造方法中重复写入一个新的版本号(和事先的版本号不同),系统就会检测到不同从而调用OnUpgrade(),你只需把你要改的参与到OnUpgrade()中就ok了

具体SqlLite操作实例,请看http://www.cnblogs.com/cczw/archive/2012/05/23/2514544.html

方式四:ContentProvider

这是一种共享数据的蕴藏情势,当您的一些数额需要透露给任何调用者时就要用用到那些了。

些微同学也许会说,我能够把数量放在文件中,比如情势一中的路线下不也得以访问吗?不可以,安卓中分外强调用户的安全性,所以重重操作都被增长了权力的注明,形式一中的路径下的文书默认是不得不让本应由访问的, (采纳公开写入权限可以访问),同时也合并了应用间共享数据访问格局。

而且,Android为常见的有的多少提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。   

首先来家喻户晓多少个概念

概念一.Uri(统一资源标识符)

 

为系统的每一个资源给其一个名字,比方说通话记录。

1、每一个ContentProvider都有所一个公共的URI,那个URI用于表示那个ContentProvider所提供的数目。 

2、Android所提供的ContentProvider都存放在android.provider包中。 将其分为A,B,C,D
4个部分:

 

必赢亚洲bwin188 3

 

A:标准前缀,用来表达一个Content
Provider控制这些多少,不可以改变的;"content://"

B:URI 的标识,它定义了是哪个Content
Provider提供这多少个数量。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完全的、小写的 类名。那些标识在
元素的 authorities属性中申明:一般是概念该ContentProvider的包.类的名目;"content://com.android.text.myprovider"

C:路径,通俗的讲就是您要操作的数据库中表的名字,或者你也可以自己定义,记得在接纳的时候保持一致就ok了;"content://com.android.text.myprovider/tablename"

D:参数,假设URI中涵盖表示需要拿到的记录的ID;则就回到该id对应的数码,假若没有ID,就代表回去全体;"content://hx.android.text.myprovider/tablename/#"
#表示数据id

概念.二UriMatcher、ContentUrist和ContentResolver

因为Uri代表了要操作的数目,所以大家很平常索要解析Uri,并从Uri中获取数据。Android系统提供了五个用于操作Uri的工具类,分别为UriMatcher
和ContentUris 。
      
UriMatcher:用于匹配Uri,它的用法如下:
       1.第一把你需要匹配Uri路径全部给登记上,如下:

       //常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
       UriMatcher  uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
       //如果match()方法匹配content://com.letchoice.providers.personprovider路径,返回匹配码为1
       uriMatcher.addURI(“com.letchoice.providers.personprovider”, “person”, 1);//添加需要匹配uri,如果匹配就会返回匹配码
       //如果match()方法匹配   content://com.letchoice.provider.personprovider/person/230路径,返回匹配码为2
       uriMatcher.addURI(“com.letchoice.providers.personprovider”, “person/#”, 2);//#号为通配符

      
2.挂号完需要配合的Uri后,就足以拔取uriMatcher.match(uri)方法对输入的Uri举办匹配,即便匹配就回来匹配码,匹配码是调用addURI()方法传入的第六个参数,假设匹配content://com.letchoice.provider.personprovider/person路径,再次回到的匹配码为1。

       ContentUris:用于获取Uri路径后边的ID部分,它有六个相比较实用的法子:
•         withAppendedId(uri,
id)用于为路径加上ID部分
•       
 parseId(uri)方法用于从路径中拿走ID部分*

      
ContentResolver:当外部应用需要对ContentProvider中的数据举行添加、删除、修改和询问操作时,可以拔取ContentResolver
类来完成,要得到ContentResolver
对象,可以使用Activity提供的getContentResolver()方法。
ContentResolver使用insert、delete、update、query方法,来操作数据。

*

接下去看个例子吗:

Step1:定义你的Provider类

public class MyContentProvider extends ContentProvider {
    private DbOpenHeler dbOpenHeler;//之前的SqlLite helper类
}

Step2:定义你的Uri

    private DbOpenHeler dbOpenHeler;
    private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);//定义一个Matcher

    // private static final int PERSON = 1;
    // private static final int PERSON = 2;
    public enum PERSON {
        // 自定义枚举参数值
        INSERT(1), DELETE(2);
        private int nCode;

        private PERSON(int nCode) {
            this.nCode = nCode;
        }

        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return String.valueOf(this.nCode);
        }

    };
//这里是你定义的Uri,分两种,一种不带参数,一种带参数
    static {
        MATCHER.addURI("com.letchoice.providers.personprovider", "person",Integer.parseInt(PERSON.INSERT.toString()));
        MATCHER.addURI("com.letchoice.providers.personprovider", "person/#",Integer.parseInt(PERSON.DELETE.toString()));
    }

 

Step3:在AndroidManifest.xml当中举行宣示

 <provider
            android:name=".MyContentProvider"
            android:authorities="com.letchoice.providers.personprovider" >
 </provider>

 

Step4:实现CURD方法(只贴一个query的)

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {
        // TODO Auto-generated method stub
        SQLiteDatabase db = dbOpenHeler.getReadableDatabase();
        switch (MATCHER.match(uri)) {//匹配检测
        case 1://如果uri不带参数就不带参数查询
            return db.query("person", projection, selection, selectionArgs,null, null, sortOrder);

        case 2://如果uri带参数就带参数查询
            long rid = ContentUris.parseId(uri);
            String where = "personId=" + rid;
            if (selection != null && !"".equals(selection.trim())) {
                where += "and" + selection;
            }
            return db.query("person", projection, where, selectionArgs, null,null, sortOrder);
        default:
            throw new IllegalArgumentException("this is Unknown Uri" + uri);
        }

    }

Step5:外部调用query拿到你想要的结果

public void testQuery() {
    Uri uri=Uri.parse("content://com.letchoice.providers.personprovider/person");
    ContentResolver resolver=this.getContext().getContentResolver();//使用ContentResolver解析uri
    Cursor cursor=resolver.query(uri, null, null, null,"personId asc");//按照personId升级排序
    cursor.moveToFirst();
    while (cursor.moveToNext()) {
        Log.i("testQuery",cursor.getString(cursor.getColumnIndex("name")));//打印出结果
    }
    cursor.close();

}

方法五:网络得到

前方介绍的三种存储都是将数据存储在该地设备上,除此之外,还有一种存储(获取)数据的方法,通过网络来促成数量的蕴藏和取得。

俺们得以调用Web瑟维斯(Service)再次回到的数目可能解析HTTP协议落实网络数据交互。

切切实实需要熟练java.net.*,Android.net.*这多个包的始末,在那就不赘述了,请我们参考相关文档。

下面是一个通过地点称号查询该地区的天气预报,以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" />  

 

一部分内容参考:

http://www.cnblogs.com/chenglong/articles/1892029.html

http://blog.sina.com.cn/s/blog_5688414b0100xagp.html

http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html

转载本站文章请注明出处:必赢亚洲56电子游戏 https://www.creatologue.com/?p=1581

上一篇:

下一篇:

相关文章

网站地图xml地图