zoukankan      html  css  js  c++  java
  • Android 数据存储

    1>SharedPreferences
         轻型的数据存储方式,本质是基于XML文件存储Key-value键值对数据。通常用来存储一些简单的配置信息。
             1> SharedPreferences对象本身只能获取数据而不支持存储和修改数据。存储修改是通过Editor对象实现。
             2> 实现SharedPreferences存储的步骤如下:
                        (1)。获得SharedPreferences对象。
                        (2)。获得SharedPreferences.Editor对象。
                        (3)。通过Editor接口的PutXxx方法保存Key-value对其中Xxx表示不同的数据类型。
         
                   //由系统指定SharedPreferences文件
                   //SharedPreferences preferences=PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
                   //自己指定SharedPreferences文件的名字以及权限。
                  SharedPreferences preferences=getSharedPreferences("SharedPreferences" , MODE_PRIVATE);
                  Editor editor=preferences.edit();
                  editor.putString( "key", "value" );
                  editor.commit();
                  editor.remove( "key");
                  editor.commit();
     
     
                  //取消息
                  preferences.getString("key", "");
                  preferences.getInt( "age", 0);
     
    2>SQLite
         SQLite支持的数据类型:NULLINTEGERTEXTBLOB。
         动态数据类型(弱引用):当某个值插入到数据库是,SQLite将会检查它的类型,如果该类型与关联的不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。
     
         SQLiteDatabase:
              提供一些管理SQLite数据库的类。
              提供创建、删除、执行SQL命令,并执行其他常见的数据库管理任务的方法。
              程序的数据库名字是唯一的。
                   db.execSQL(sql);     //执行任何SQL语句
                   db.insert(table,nullColumnHack,values);
                   db.delete(table,whereClause,whereArgs);
                   db.update(table,values,whereClause,whereArgs);
                   db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy);
                   db.rawQuery(sql,selectionArgs);
                   
    Cursor是Android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量小时不会存在内存问题,而且虚拟机能保证Cusor最终被释放。
    如果cursor的数据量特表大,特别是如果里面有blob信息时,应该保证Crusor占用的内存被及时释放掉,而不是等待GC来处理,并且Android明显是倾向于编程者手动将cursor close掉的,因为在源代码中我们发现,如果等到GC来回收是,也就是如果不手动关闭,系统会报错,会给用户以错误提示。
         Cursor:游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等常用方法。
         getCount()  总记录数
         isFirst();     判断是否第一条记录
         isLast();     判断是否最后一条记录
         moveToFirst();     移动到第一条记录
         moveToLast();     移动到最后一条记录
         move(int offset);     移动到指定记录
         moveToNext();          移动到下一条记录
         moveToPrevious();     移动到上一条记录
         getColumnIndexOrThrow(String columnName);     据列名获得列索引
         getInt(int columnIndex);     获得指定列索引的INT类型值
         getString(int columnIndex);     获得指定列索引的String类型值
     
         
                   //创建数据库
                  SQLiteDatabase db=openOrCreateDatabase( "SQLite.db", MODE_PRIVATE , null);
                  db.execSQL( "create table if not exists usertb(_id integer primary key autoincrement,name text not null,age integer not null,sex text not null )");
                  db.execSQL( "insert into usertb(name,sex,age) values('az','man','19')");
                  Cursor c=db.rawQuery( "select * from usertb", null );
                   if(c!=null ){
                          while(c.moveToNext()){
                               c.getInt(c.getColumnIndexOrThrow( "_id"));
                         }
                         c.close();            //释放游标
                  }
                  db.close();    //释放数据库对象
     
         
    ContentValues
         这个类是用来存储一组可以被ContextResolver处理的值。
              ContentValues values=new ContentValues();     //类似hashMap key value 的形式
              values.put("name","zhangsan");
     
                   //创建数据库
                  SQLiteDatabase db=openOrCreateDatabase( "SQLite.db", MODE_PRIVATE , null);
                  db.execSQL( "create table if not exists stutb (_id integer primary key autoincrement)");
                  ContentValues values= new ContentValues();
                  values.put( "name", "张三" );
                   long rowid=db.insert( TABLE_NAME, null , values);         //返回插入的行数
                  values.clear();       //清空values
                  values.put( "name", "张三" );
                  db.insert( TABLE_NAME, null , values);     
                  values.clear();
                  values.put( "name", "李四" );
                  db.update( TABLE_NAME, values, "_id>?" , new String[]{"3"});     //将所有ID大于三的name该成李四
                  db.delete( TABLE_NAME, "name like ?" , new String[]{"%四%"});    //删除所有name中带有“四”的人
                  Cursor c=db.query( TABLE_NAME,null , "name like ?" , new String[]{"0"}, null, null , "name" );
                   if(c!=null ){
                         String[] column=c.getColumnNames();
                                while (c.moveToNext()) {
                                      
                                      
                               }
                               c.close();
                  }
                  db.close();
           }
     
     
    SQLiteOpenHelper:
         SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新
          一般是建立一个类继承它,并重新onCreate()和onUpgrade()方法
              onCreate(SQLiteDatabase db);          创建数据库时调用
              onUpgrade(SQLiteDatabase db,int oldVersion,int new Version);     版本更新是调用
              getReadableDatabase();          //创建或打开一个只读数据库
              getWritableDatabase();          //创建或打开一个读写数据库
     
    public class SQLitedata extends SQLiteOpenHelper{
     
            public SQLitedata(Context context, String name, CursorFactory factory,
                          int version) {
                   super(context, name, factory, version);
                   // TODO Auto-generated constructor stub
           }
     
            /**
            * 首次创建数据库时调用,一般可以把建库、建表的操作
            */
            @Override
            public void onCreate(SQLiteDatabase db) {
                  db.execSQL( "create table if not exists stutb(_id integer primary key autoincrement)");
                  
           }
     
            /**
            * 当数据库版本发生变化时会自动执行
            */
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
           }
    }
     
     
    public class MainActivity extends Activity {
     
            public static final String TABLE_NAME= "stutb";
           
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                   super.onCreate(savedInstanceState);
                  setContentView(R.layout. activity_main);
                  SQLitedata litedata= new SQLitedata(MainActivity.this,"stu.db", null, 0);
                  litedata.getReadableDatabase();           //获取一个只读的数据库
                  SQLiteDatabase db=litedata.getWritableDatabase();       //获取一个可读可写的数据库
                  Cursor c=db.rawQuery( "select * from stutv", null );
                  c.close();
                  db.close();
           }
     
           
    }
     
    3>Content Provider
              如何实现ContentProvider
                   1.继承抽象类contentprovide实现一系列针对于数据的增、删、改、查等方法。
                   2.需在AndroidMainfest.xml中完成对contentprovider的注册。
                        <provider
                                  android:name="com.az.MusicProvider"
                                  android:name="com.provider.music"
                        ></provider>
    注册的authorities属性值是全局唯一的。
     
    /**
     * URI 通用资源标识符个
     * content://packagename/music/#
     * UriMatcher类
     *      Urimatcher matcher=new UriMarcher(UriMarcher.NO_MATCH);
     *            UriMatcher.NO_MATCH 表示不匹配任何路径的返回值
     *     marcher.addURI("com.az.provider","music",1);
     *     往UriMarcher类里添加一个拼凑的 Uri
     *     UriMatcher为 Uri的容器,容器里面包含着我们即将可能要操作的 Uri
     *     如果通过match()方法匹配成功就返回code值
     * matcher.match(uri)
     *     首先与找通过addURI()方法添加进来的 Uri匹配。
     *     匹配成功则返回设置的code值,反之,返回一个UriMatcher.NO_MATCH   常量( -1)
     *
     * ContentResolver:
     *     使用contentResolver操作 contentprovider中的数据:
     *            当外部应用需要对 contentprovider中的数据进行添加、删除、修改和查询时
     *            可以使用contentResolver类来完成
     *            使用activity提供的getContentResover()方法获取ContentResover对象。
     * ContentResolver类提供了与contentProvider相同签名的四个方法
     *            public Uri insert(Uri rui,ContentValues values)
     *                    该方法用于往 contentprovider添加数据
     *            public int delete(Uri uri,String selection,String[] selectionArgs)
     *                   该方法用于从contentProvider删除数据
     *            public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)
     *                   该方法用户更新 contentprovier中的数据
     *            public Cursor query( Uri uri ,String[] projection,String selection,String[] selectionArgs,String sortOrder)
     *                   该方法用于从contentProvider中获取数据
     * @author az
     *
     */
    public class MyContentProider extends ContentProvider{
     
            /**
            * 根据URI删除selection指定的条件所匹配的全部记录
            */
            @Override
            public int delete(Uri uri, String selection, String[] selectionArgs) {
                   // TODO Auto-generated method stub
                   return 0;
           }
     
            /**
            * 返回当前URI的MIME类型,
            * 如果该URI对应的数据可能包含多条记录,那么MIME类型字符串就是以vnd.android.dir/开头
            * 如果该URI对应的数据只包含一条记录,该MIME类型字符串就是以vnd.android.cursor。item/开头
            */
            @Override
            public String getType(Uri uri) {
                   // TODO Auto-generated method stub
                   return null ;
           }
     
            /**
            * 根据URI插入的values对应的数据
            */
            @Override
            public Uri insert(Uri uri, ContentValues values) {
                   // TODO Auto-generated method stub
                   return null ;
           }
     
            /**
            * 在 contentprovider创建后被调用
            */
            @Override
            public boolean onCreate() {
                   // TODO Auto-generated method stub
                   return false ;
           }
     
            /**
            * 根据URI查询出selection指定的条件所匹配的全部记录,并且可以指定查询那些列,以什么方式排序
            */
            @Override
            public Cursor query(Uri uri, String[] projection, String selection,
                         String[] selectionArgs, String sortOrder) {
                   // TODO Auto-generated method stub
                   return null ;
           }
     
            /**
            * 根据URI修改selection指定的条件所匹配的全部记录
            */
            @Override
            public int update(Uri uri, ContentValues values, String selection,
                         String[] selectionArgs) {
                   // TODO Auto-generated method stub
                   return 0;
           }
    }
     
         
    4>File
         Android中文件存储的操作:
              activity的openFileOutput()方法可以用于把数据输出到文件中
              创建的文件保存在/data/data/<package name>/files目录
              实现过程与在java中保存数据到文件中是一样的
     
                  File file=this.getFilesDir();      //这个目录是当前应用程序默认的数据存储目录
                  File file0= this.getCacheDir();    //这个目录是当前应用程序默认的缓存文件的存放位置       如果手机的内存不足时,系统会自动去删除APP的cache目录的数据
                  File file2= this.getDir("" , MODE_PRIVATE);        //自定义目录
                   this.getExternalCacheDir();//外部缓存目录
                   this.getExternalFilesDir(type);    //外置目录
     
    写入文件
                  FileOutputStream fileOutputStream=openFileOutput( name, mode ); //打开一个文件
                  fileOutputStream.wait();    //写入
                  fileOutputStream.close();   //关闭
     
    读取文件(以流的形式)
                  FileInputStream fileInputStream=openFileInput( name);
                  ByteArrayOutputStream byteArrayOutputStream= new ByteArrayOutputStream();
    stareblankly.cn
  • 相关阅读:
    Android和kernel杂散点集合
    Kernel的IIC驱动分析
    Uboot流程分析
    关于在eclipse当中,对接口方法的实现使用@Override报错的解决方式
    任务调度工具oozie和azkaban的对比
    实现Linux和windows之间实现文件传输的问题解决方式。sftp和ftp
    使用spring-boot创建定时任务。同时创建多线程执行定时任务。
    【C++11】新特性——auto的使用
    Inline函数使用注意事项
    结构体变量的sizeof计算
  • 原文地址:https://www.cnblogs.com/stareblankly/p/4844188.html
Copyright © 2011-2022 走看看