Android学习笔记(三)

★Android数据存储:IO、偏好设置、数据库(SQLite)、ContentProvider、网络存储

◆Android数据库(SQLite)
▲创建数据库:
○boolean exits = getDatabasePath("stu.db").exists();//判断要创建的数据库是否存在。
○SQLiteDatabase db = context.openOrCreateDatabase(String dbName,int mode,CursorFactory factory);mode为访问模式,默认设为私有 MODE_PRIVATE

★在实际应用中一般是创建一个数据库类DBOpenHelper使继承SQLiteOpenHelper;其中若在构造方法中指定的数据库不存在,则在oncreate方法中自动创建,故一般在此方法中执行初始化操作,如创建表;该方法在指定的数据库不存在时才执行;
使用时,创建一个DBOpenHelper helper;若用SQLiteDatabase db = helper.getReadableDatabase();即对该数据库只读,不能写入和操作操作,可用于查询;此方式比较安全;若要增、删、改需用SQLiteDatabase db = helper.getWritableDatabase();

◆数据库操作:
数据库操作的步骤:
→1、打开或创建数据库,并获取用于访问该数据库的数据访问对象
→2、调用SQLiteDatabase对象的方法执行操作
→3、释放资源 .close();
★在创建数据表时一定要有一个主键,并且名为”_id”;一定要有下划线,方便在contentProvider中访问。;

※创建表:db.execSQL("drop table if exists user,create...");
调用SQLiteDatabase对象的:
△void execSQL(String sql):执行所有sql语句
△void execSQL(String sql,Object[] objs):执行占位符的sql语句;
△Cursor rawQuery(String sql,String[] whereArgs):执行带占位符的查询方法,返回的Cursor相当于ResultSet;
△long insert(String tblName,String nullcolName,ContentValues values):封装的插入方法,参数分 别为表名,要强行插入null值的列名;在values中putXXX(key,value)传入要修改的列名和值;
△int update(String tblname,ContentValues values,String where,Strin[] whereArgs):封装的修改方法;where为where后的条件,如”_id=?”,whereArgs即为?所代表的值;
△int delete(String tblName,String where,String[] whereArgs):封装的删除方法,参数同修改,都返回一个int值,改变了多少行;
△Cursor query(String tblName,String[] projection,String where,String[] args,String groupby,String having,String order):封装的查询方法;projection为要查询的列名,若为null即查询所有的列;后三个参数为分组,having条件,排序条件。
[§★封装方法内部是将传入的参数拼接成一个sql语句并执行。故一般情况下,增,删,改可用封装的方法,可减少拼接sql语句错误,而查询可执行自定义sql语句]
△void close():关闭数据库;
事务操作
△db.beginTransaction();开启事务
△db.endTransaction();提交事务

[★与mysql的区别:id字段主键类型只支持 integer,不支持int类型;自增为:autoincrement]

◆Cursor 主要方法:
△ boolean moveToNext():移动游标到下一个
△ boolean moveToPrevious():移动游标到上一个
△ boolean moveToFirst():移动游标到第一个
△ boolean moveToLast():移动游标到最后一个
△ boolean moveToPosition(int position): 移动游标到指定位置
△ boolean move(int offset):以当前位置为参考移动偏移量,如为正数向下移动n个,负数向上移动n个

◆取值:
△int getInt(int colIndex):
△String getString(int colIndex)

△int getColumnIndex(String columnName):通过字段取出索引
☆SQLite只支持通过列索引取列值,不支持通过列名取值,而Mysql还支持通过列名取值;故需将两个方法一起使用:c.getString(c.getColumnIndex("name")))

◆uri
Uri:通用资源标识符。
UrL:统一资源定位符
在Android中用于标记系统内资源的路径。
▲格式为:协议(scheme)、主机地址(post)、端口号(port)、路径(path)。授权字符串:authority == host+port
mimetype类型:父类型/子类型;如image/jpeg;
▲Uri
获取实例:static Uri parse(String url)
★主要方法:
String getScheme():协议 String getHost()
String getAuthority() int getPort()
String getPath()
String getLastPathSegment():最后请求部分;
static Uri withAppendPath(Uri baseUri,String path):对原始uri追加一个路径,返回一个新的uri,原始的uri不变。
★内容提供程序的uri分成两类:
单条数据的uri : 有id
多条数据的uri : 没有id

▲UriMatcher
构造方法:UriMathcer(int noMatch);new UriMatcher(UriMatcher.NO_MATCH)
▲主要方法:
§void addURI(String authority,String path,int code):path中*为通配;#为精确匹配。code为若成功匹配match(uri)后要返回的整数值。
§int match(Uri uri):匹配。

◆ContentProvider:
是Android的四大组件之一;提供了数据共享的标准访问接口。用于实现跨程序间的数据访问,可在一个程序中访问另一个程序的数据库。
▲ContentProvider主要方法:
△ boolean onCreate():创建方法,可在其中做初始化操作;
△ long insert(Uri uri,ContentValues values):对uri请求的表进行插入操作插入不支持单条uri.不需要id;
△ int update(Uri uri,ContentValues values,String where,String[] whereArgs)
△ int delete(Uri uri,String where,String[] whereArgs)
△ Cursor query(Uri uri,String[] projection,String where,String[] whereArgs,String order) :projection为要查询的列字段。
△ String getType(Uri uri):通过macth(uri)进行匹配,对比匹配后的int值判断返回此uri是单条数据的还是多条数据的uri;一般返回两个值;vnd.android.cursor.dir //内容提供程序的多条数据;vnd.android.cursor.item //内容提供程序的单条数据;要在后面可追加自定义对象"vnd.android.cursor/dir/student"; "vnd.android.cursor/item/student";
★[provider其自身没有context,但可通过this.getContext()取得context对象]

◆内容提供程序provider的Uri
scheme : content:// [android中定义的协议头]
authority : 一个自定义的字符串,唯一,授权字符串;
path :自定义的字符串,可包含请求的表
[id] :用于查、删、改的id,插入需要,可不指定。
◆ContentUris
static long parseId(Uri uri) :用于从一个单条数据中取出id值;
static Uri withAppendId(Uri uri,long id);用于将id和一个uri拼接成一个单条数据;

●使用ContentProvider提供数据的步骤:
→1、创建数据库
→2、创建一个类继承自ContentProvider
→3、注册:提供授权字符串(authority);在Manifest文件中添加

  //为true为才对外公开,为false不对外公开

→4、重写上述类的insert、update、delete、query方法
1)分析uri 确定要访问的表 、条件
2)执行具体操作
★用ContentResolver访问内容提供程序步骤
→1、 准备uri
→2、准备数据或条件
→3、获取ContentResolver=getContentResolver();
→4、执行操作。调用ContentResolver的insert update delete query方法

★观察者模式:
§在服务端,定义一个公共的接口interface Observer{void getData(data)};,在接口中定义一个提供数据的方法;然后创建一个注册的方法,即创建一个观察者的集合ArrayList list;
§在客户端,实现公共接口Observer,并重写getData(data)方法,即成为Observer的一个子类;然后实现服务器端的注册方法,把自己即加入到list集合中;
§在服务器若有数据变更,则遍历list中所有的对象,调用每个对象的getData(data)的方法,即可将最新的数据推送到客户端。

★Android中的观察者模式使用:
为内容提供程序提供观察者支持:在ContentProvider的增、删、改方法中,当数据发生变化时调用getContext().getContentResolver().notifyChange(uri,observer);//参数分别为当前发生了改变的uri下的资源;observer为要通知的观察者;若为null则为所有的观察者。
★内容体接收ContentResolver需的访问者
※1、创建类Observer 扩展继承 ContentObserver;重写onChange方法,在该方法中通过handler将数据变更的消息发送回主线程
※2、创建handler,并使用该handler创建上述类的对象在handler的handleMessage方法中,根据数据变更的情况执行适当的操作,更新adapter数据列表
※3、注册一个观察者;调用ContentResolver对象的registerContentObserver(uri,true,observer);参数要为哪个数据表注册;第二个参数为notifyForDescendents,即派生资源如/a/b等发生了改变时是否要接收到通知,为true时则接收。observer为继承了ContentObserver类的Observer实例。

◆多媒体提供程序
提供所有媒体(音频、视频、图片)的信息;它将所有的信息存入在一个数据库中;在每次开机或插入SD卡时,通过内部的MediaScanner()方法对所有文件进行扫描;然后通过MediaProvider()将数据库中的数据公开出去。该数据库位于data/data/com.android.providers.media/databases下。
▲使用:可直接调用Media,分为Images、Video、Audio三种不同的包,并可直接引用所有的字段;
如查询:cr.query(Media.EXTERNAL_CONTENT_URI, null, null, null, null);// .EXTERNAL_CONTENT_URI为外部存储即SD卡中媒体文件;.INTERNAL_CONTENT_URI为内部存储的媒体文件。
●媒体提供程序——图片Images;
相关的表和视图:
主要的表和视图:
略缩图thumbnails:_id _data image_id kind width height
images:_id _data _display_name _size title width height
[在4.0版本后只有打开过的图片才生成略缩图,而之前对所有图片都加载]
images: _id _data _size _display_name title date_added width height
★Media.getBitmap(cr, url);得到图片的位图;
Thumbnails.getThumbnail(cr, id, Thumbnails.MINI_KIND, null);//得到缩略图

◆媒体库:
△相关的表和视图
audio : _id _data _display_name _size title album album_key artist composer duration
album_info : _id album album_key artist album_art
artist_info: _id artist artist_key
音频:
◆播放:

MediaPlayer player = new MediaPlayer();
player.reset();//先设置再装入数据;
player.setDataSource(m.getMusicPath());//包括其他参数重写方法
player.prepare();//需要先准备预读,再开始播放。
player.start();
player.release();//在Service或要退出程序时应用此方法释放播放器
player.pause();

博客地址:Android学习笔记(三)

你可能感兴趣的:(Android学习笔记(三))