android基础

数据篇 

Android的四种数据存储方式: 

1.SharePreference 

2.SQLite 

 3.Content Provider

 4.File SharePreferences: 

 1.是一种轻型的数据存储方式 2.本质是基于XML文件存储key-value键值对数据 3.通常用来存储一些简单的配置信息 SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor 对象实现 实现SharedPreferences存储的步骤如下: 1.获得Sharedpreference对象 2.获得SharedPreferences.Editor对象 3.通过Editor接口的putxxx方法保存key-value对其中xxx表示不同的数据类型 4.通过Editor接口的commit方法保存key-value键值对 SQLiteSQLite简介 SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有的操作系统上运行。- 支持高达2TB大小的数据库- 以单个文件的形式存在- 以B-Tree的数据结构形式存储在磁盘特点主要包括: 1.轻量级 一个动态库 单文件 2.独立性 没有依赖 无序安装 3.隔离性 全部在一个文件夹中 4.跨平台 支持众多操作系统 5.多语言接口 支持众多编程语言 6.安全性 事务关于事务的安全性问题: -通过数据库上的独占性和共享锁来实现独立事务处理 -多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据 关于SQLite的数据类型: -SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型 -依次代表:空值、整型、浮点型、字符串值、二进制对象 动态数据类型(弱引用) -当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。 使用须知: -由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地。 如Android IOS -没有可用于SQLite的网络服务器、只能通过网络共享可能存在文件锁定或者性能问题。 -只提供数据库级的锁定 -没有用户账户概念,而是根据文件系统确定所有数据库的权限。 在Android中如何使用SQLite: -SQLiteDatabase 1.提供了一些管理SQLite数据库的类 2.提供创建,删除,执行SQL命令,并执行其他常见的数据库管理任务的方法 3.每个程序的数据库名字时唯一的 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) -SQLiteOpenHelper Cursor时Android查询数据后得到的一个管理数据集合的类,正常情况下,如果查询得到的数据量较小时不会有内存问题,而且虚拟机能够保证Cursor最终被释放掉 然而如果Cursor的数据量特别大,特别是如果里面有Blob信息时,应该保证Cursor占用的内存被及时的释放掉,而不是等待GC来处理。并且Android明显时倾向于编程者手动的将Cursor close掉,因为在源代码中我们发现,如果等到垃圾回收器来回收时,也就是如果不关闭,系统会摆错,会给用户错误提示。 Cursor:游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等。常用方法: getCount() 总记录条数 isFirst() 判断是否第一条记录 isLast() 判断是否最后一条记录 moveToFirst() 移动到第一条记录 moveToLast() 移动到最后一条记录 move(int offset)移动到指定记录 moveToNext()移到下一条记录 moveToPrevious()移动到上一条记录 getColumnIndexOrThrow()根据列名称获得索引 getInt(int columbIndex)获得指定列索引的int类型值 getString(int columnIndex)获得指定列缩影的String类型值 用系统内置的sql函数 ContentValues: 这个类是用来存储一组可以被ContentResolver处理的值 ContentValues values=new ContentValues();//类似hashMap key value values.put("name","zhangsan"); 执行对应的sql操作 SQLiteOpenHelper -SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新 -一般是建立一个类继承它,并重写onCreate()和onUpgrade()方法 -方法说明 onCreate(SQLiteDatabase db) 创建数据库时调用 ,一般建库建表时候提供 onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) 一般用于备份恢复数据 getReadableDatabase() 创建或打开一个只读数据库 getWritableDatabase() 创建或打开一个读写数据库 文件存储Android中文件存储的操作-Activity的openFileOutput()方法可以用于把数据输出到文件中-创建的文件保存在/data/data/包名/files目录-实现过程在java中保存数据到文件中是一样的MODE_PRIVATE-为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。MODE_APPEND-模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。MODE_WORLD_TEAD和MODE_WORLD_WRITEABLE-用来控制其他应用是否有权限读写该文件android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharepreferences,数据库都应该私有的(位于 /data/data/包名/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITABLE,只有这样其他程序才能正确访问。 ContentProvider数据存储方式:-Shared Preference-文件存储-SQLite-其他还有网络存储等上述不可完成的任务-都是在单独的一个应用程序之中达到一个数据的共享如何理解ContentProviderContentProvider 通过Uri(增删改查) 其他应用程序如何实现ContentProvider1.继承抽象类ContentProvider 实现一系列针对数据的增删改查等方法;2.需要在AndroidMainfest.xml中完成对ContentProvider的注册 注:注册的authorities属性值是全局唯一的何为Uri: -Uri是指通用资源标志符 content://com.xxx.provider/music/# content:// 前缀表明数据受控于一个内容提供者。它从不修改,也就是schema com.xxx.provider 是指在androidMainfest.xml中我们注册的provider中的 android:authorities属性所对应的 /music 具体操作于哪个条目 /# 具体指定到哪个条目下的哪条记录(#表示通配符) UriMatcher类 UriMatcher matcher =new UriMatcher(UriMatcher.NO_MATCH); UriMatcher.NO_MATCH 表示不匹配任何路径的返回码 matcher.addURI("com.xxx.provider","music",1); 往UriMatcher类里添加一个拼凑的Uri UriMatcher为一个Uri的容器,容器里包含我们即将要操作的Uri 如果通过match()方法匹配成功就返回code值 matcher.match(uri) 首先与找通过addURI()方法添加进来的Uri匹配 匹配成功则返回设置的code值,反之,返回一个UriMatcher.NO_MATVH 常量(-1) ContentResolver: 使用ContentResolver操作ContentProvider中的数据: 当外部应用需要对ContentProvider中的数据进行添加、删除、修改、和查询操作时,可以使用Contentprovider类来完成 使用Activity提供的getContentResolver()方法获取ContentResolver对象 ContentResolver 类提供了与ContentProvider类相同签名的四个方法 ContentResolver类提供了与ContentProvider类相同签名的四个方法: -public Uri insert(Uri uri,ContentValues values) 该方法用于往ContentProvider添加数据 -public int delete(Uri uri,String selection,String[] selectionArgs) -public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs) -public Cursor query(Uri uri,String[] projection,String selection, String[] selectionArgs,String sortOrder) 广播接受者1.Broadcast(广播) 是一种广泛运用在应用程序之间传输信息的机制2.BroadcastReceiver (广播接受者) 是对发送出来的广播进行过滤并接收响应的一类组件,它就是用来接收来自系统和应用中的广播3.用途 当开机完成后系统会产生一条广播 当网络状态改变时系统会产生一条广播 当电量改变时,系统会产生一条广播Android为什么要这样设计 大大减少工作量和开发周期 作为应用开发者,只需掌握BroadcastReceiver使用方法:发送: 把信息装入一个Intent对象(如Action、Category) 通过调用相应的方法将对象Intent对象以广播方式发送出去 .sendBroadcast() .sendOrderBroadcast() .sendStickyBroadcast()接受: 当Intent发送以后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法 注意:BroadcastReceiverr需要注册 静态注册 代码注册 BroadcastReceiver的生命周期只有十秒左右 在BroadcastReceiver里不能做一些比较耗时操作 应该通过Intent给Service,由Service完成 不能使用子线程 广播的种类: 普通广播(Normal broadcasts) 所有监听该广播的广播接受者都可以监听到该广播 有序广播(Ordered broadcasts) 按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中 声明,-1000到1000之间,值越大优先级越高。可以终止广播意图的继续传播。接收者可以篡改内容。 异步广播(粘滞性滞留广播) 不能将处理结果传给下一个接收者,无法终止广播。普通广播特点: 同级别接收先后是随机的(无序) 级别低的后收到广播 接收器不能截断广播的继续传播也不能处理广播 同级别动态注册高于静态注册收到广播有序广播特点: 同级别接收顺序是随机的 能截断广播继续传播,高级别的广播接收器收到该广播后,可以决定把该广播是否截断 接收器能截断广播的继续传播,也能处理广播 同级别动态注册高于静态注册 Service定义: 后台运行,不可见,没有界面 优先级高于Activity用途: 播放音乐,记录地理位置的改变、监听某种动作注意: 运行在主线程,不能用它来做耗时的请求或者动作 可以在服务中开一个线程,在线程中做耗时动作类型: 1.本地服务(Local Service) 应用程序内部 startService stopService stopSelf stopSelfResult bindService unbindService 2.远程服务(Remote Service) Android 系统内部的应用程序之间 定义IBinder接口 Start方式特点: 服务跟启动源没有任何联系 无法得到服务对象 Bind方式特点: 通过IBinder接口实例,返回一个ServiceConnection对象给启动源 通过ServiceConnection对象的相关方法可以得到Service对象 GestureDetector 手势交互过程 1.触屏一刹那,触发MotionEvent事件 2.被OnTouchListener监听,在onTouch()中获得MotionEvent对象 3.GestureDetector转发MotionEvent对象至OnGestureListener 4.OnGestureListener获得该对象,根据该对象封装的信息做出合适的反馈 MotionEvent 1.用于封装手势、触摸笔、轨迹球等动作事件 2.内部封装用于记录横轴和纵轴坐标的属性X和Y GestureDetector 识别各种手势 OnGestureListener 1.手势交互的监听接口,其提供多个抽象方法 2.根据GestureDetector的手势识别结果调用相应的方法 GestureDetector详解: 触摸屏:按下、移动、抬起等 重载onTouch或者设置setOntouchListener GestureDetector工作原理 1.当接收到用户触摸消息时,将消息交给GestureDetector加工 2.通过设置监听器获得GestureDetector处理后的手势 GestureDetector提供两个监听器 1.OnGestureListener:处理单击类消息 单击:onDown(MotionEvent e) 抬起:onSingleTapUp(MotionEvent e) 短按:onShowPress(MotionEvent) 长按:onLongPress(MotionEvent e) 滚动:onScroll(MotionEvent e1,MotionEvevt e2,float distanceX, float distanceY) 2.OnDoubleTapListener:处理双击类消息 双击:onDoubleTap(MotionEvent e) 双击按下和抬起各触发一次:onDoubleTapEvent(MotionEvent e) 单击确认:onSingleTapConfirmed(MotionEvent e) 即很快的按下并抬起,但并不连续点击第二下

你可能感兴趣的:(android基础)