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支持的数据类型:NULL\INTEGER\TEXT\BLOB。
     动态数据类型(弱引用):当某个值插入到数据库是,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();

转载于:https://www.cnblogs.com/stareblankly/p/4844188.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值