-
如何实现 ContentProvider? 1. 继承抽象类 ContentProvider 实现一系列针对于数据的增删改查等方法; 2. 需在 AndroidManifest.xml 中完成对 ContentProvider的注册。 <provider android:name="com.imooc.MusicProvider" android:authorities="com.provider.music" ></provider> 注:注册的anthorities的属性值,是全局唯一的。 第三方的访问能力完全取决于你自定义的ContentProvider,如果定义的ContentProvider只实现查询功能,那么第三方程序就只能做查询的操作,不能做其他的操作。 继承 ContentProvider 之后实现的几个方法: onCreate() :在ContentProvider创建后使用。 Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):根据Uri查询selection指定的条件所匹配的全部记录,并且可以指定查询哪些字段、以什么方式排序。 insert(Uri uri, ContentValues values):根据Uri插入values对应的数据。 delete(Uri uri, String selection, String[] selectionArgs):根据Uri删除selection指定的条件所匹配的全部记录。 update(Uri uri, ContentValues contentValues, String selection, String[] selectionArgs):根据Uri修改selection指定的条件所匹配的全部记录。 比较值得注意的如下: getType(Uri uri):返回当前Uri的 MIME 类型。 如果当前的Uri包含多条记录,那么 MIME 类型字符串就以 vnd.android.dir/ 开头。 如果该Uri对应的数据只有一条记录,那么 MIME 类型字符串就以 vnd.android.cursor.item/ 开头查看全部
-
数据存储方式: Shared Preferences 文件存储 SQLite 其他还有网络存储等 缺点:都只是在单独的一个应用程序之中达到一个数据的共享,不能访问其他应用的数据。 —————————————————— ContentProvider 提供数据查看全部
-
数据篇——File 开启输入流: Android中文件存储的操作: Activity提供了 openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在Java中保存数据到文件中是一样的。 创建的文件保存在/data/data/<package name>/files目录 openFileOutput(fileName,MODE):第一个参数是文件的名字,第二个参数是权限,权限可以叠加的。 如果希望文件被其他应用读和写,可以传入: MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE,也就是说,权限是可以合理地叠加在一起。 ------------------ 当应用程序在安装时,系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库应该都是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了MODE_WORLD_READABLE 或者 MODE_WORLD_WRITEABLE。查看全部
-
File file = this.getFilesDir(); // 获取文件目录,这个目录是当前应用程序默认的数据存储目录 Log.i("info",file.toString()); ---------- File file = this.getCacheDir(); //这个目录是当前应用程序默认的缓存文件的存放位置 Log.i("info",file.toString()); 一些不是非常重要的文件可以通过这种方法创建、使用; 如果手机的内存不足的时候,系统会自动去删除App的chche目录的数据。 ------------------- File file = this.getDir("imooc",MODE_PRIVATE); Log.i("info",file.toString()); ------------------ 权限 MODE_PRIVATE - 为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。 MODE_APPEND - 模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE - 用来控制其他应用是否有权限读写该文件 MODE_WORLD_READABLE - 表示当前文件可以被其他应用读取 MODE_WORLD_WRITEABLE - 表示当前文件可以被其他应用写入 ----------------- 外部文件 this.getExternalFilesDir(type); ----------------- 可以得到外部的存储位置,该位置的数据跟内置是使用是一样的; 优点:如果App卸载了,这里面的数据也会自动清除干净,没有残留 File file = this.getExternalCacheDir(); Log.i("info",file.toString()); 注意:如果开发者不遵守规则,没有把数据放入 data/data/<包名> 或者 /mnt/sdcard/Android/data/<包名>,那么,卸载之后数据将不会自动清除,将会造成很多垃圾数据。查看全部
-
数据篇——文件存储 -- Activity的openFileOutput()方法可以用于把数据输出到文件中 -- 创建的文件保存在 /data/data/<package name>/files 目录 -- 实现过程与在 Java 中保存数据到文件中是一样的 new File("/mnt/sdcard/test"); 路径指向安卓自带的目录,指向SD卡。 new File("/mnt/extsdcard/test"); 指向外存储卡,但模拟器并没有这个。 如果想要往文件中写入数据,需要相关的权限,不加权限是会报错的。 如图,文件的创建和删除。查看全部
-
新建一个类DBOpenHelper,继承SQLiteOpenHelper: public class DBOpenHelper extends SQLiteOpenHelper{ // DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 这里把后两个参数写死 public DBOpenHelper(Context context, String name) { super(context, name, null, 1); // 真正的操作要自己百度 } @Override // 首次创建数据库的时候调用,一般用于新建数据库、数据表 public void onCreate(SQLiteDatabase db) { db.execSQL("create table if not exists stutb(_id integer primary key autoincrement, name text not null, sex text not null, age integer not null)"); db.execSQL("insert into stutb(name,sex,age) values('Lucy','女',20)"); } @Override // 当数据库的版本发生变化的时候,会自动执行 public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { } }查看全部
-
SQLiteOpenHelper -- SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新。 -- 一般是建立一个类继承它,在构造方法中初始化一些变量,并重写onCreate()和onUpgrade()方法。 -- 方法说明 * onCreate(SQLiteDatabase db) 创建数据库和数据表的时候调用 * onUpgrade(SQliteDatabase db,int oldVersion,int newVersion) 版本更新时调用。是系统自动调用,不允许手动调用。 * getReadableDatabase() 创建或打开一个只读数据库 * getWritableDatabase() 创建或打开一个读写数据库 ------------------ getWritableDatabase()和getReadableDatabase()的相同点以及区别: 1. getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例,正常情况下获得的实例都可以对数据库进行读写操作。 2. getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常)。 3. getReadableDatabase取得的实例是先调用getWritableDatabase以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase的实例以只读的方式去打开数据库。查看全部
-
**删** db.delete("stutb","name like ?",new String[]{"%丰%"}); //将名字中带有“丰”的记录删除掉。 **改** values.put("sex","女"); db.update("stutb",values,"_id > ?",new String[]{"3"}); // 记住id是有下划线的;其中?是变量,变量的值在后面的String数组里面。 **查** //查询所有id>0的记录,并按年龄排序 Cursor c = db.query("stutb",null,"_id>?",new String[]{"0"},null,null,"age"); if (c!=null){ String[] columns = c.getColumnNames(); while (c.moveToNext()){ for(String columnNames : columns){ Log.i("info",c.getString(c.getColumnIndex(columnNames))); } } c.close(); } db.close();查看全部
-
代码实现 1. 首先是创建数据库,和上一节课一样: SQLiteDatabase db = openOrCreateDatabase("stu.db",MODE_PRIVATE,null); 2. 然后是创建表格,和上一节一样: db.execSQL("create table if not exists stutb (_id integer primary key autoincrement, name text not null, sex text not null, age integer not null )"); 3. **增** :使用 ContentValues 向表格中添加数据: ContentValues values = new ContentValues();// 类似HashMap values.put("name","张三"); values.put("sex","男"); values.put("age",20); db.insert("stutb",null,values);//将values包含的数据插入到表格中 values.clear();//清空values,方便下次操作,不然数据会叠加。 values.put("name","李四"); values.put("sex","男"); values.put("age",22); db.insert("stutb",null,values); values.clear(); 。。。。查看全部
-
使用原生的sql语句很容易写错(这也导致效率的降低),还好安卓有其他的方法可以写入数据,无需每次都去写sql语句,我们可以使用ContentValue,另外,不推荐使用前面学的 execSQL(sql)。 ContentValuse: --这个类是用来存储一组可以被ContentResolver处理的值。 * ContentValues values = new ContentValues(); //类似 hashMap key value。 * values.put("name","张三"); * 执行对应的Sql操作。查看全部
-
编程部分 // 打开或创建(如果有就打开,没有就创建,所以没有“覆盖”的问题)一个数据库 SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null); // 第二参数是权限,设为私有,也就是只有本程序才可访问。第三参数是游标,不需要。 String sql ="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(sql); String sql2="insert into usertb (name,age,sex) values('张三','男',20)"; db.execSQL(sql2); db.execSQL("insert into usertb (name,age,sex) values('李四','男',23)"); Cursor cursor = db.rawQuery("select * from usertb",null); // null表示不加条件 if (cursor!=null){ while(cursor.moveToNext()){ Log.i("info","_id"+cursor.getInt(cursor.getColumnIndex("_id")));// 先获得列的编号,再通过编号获得对应的值。 Log.i("info","name="+cursor.getString(cursor.getColumnIndex("name"))); Log.i("info","sex="+cursor.getString(cursor.getColumnIndex("sex"))); Log.i("info","age="+cursor.getInt(cursor.getColumnIndex("age"))); } cursor.close(); // 释放资源 } db.close(); // 关闭数据,释放内存查看全部
-
注意事项 1. 命名规范:数据库的名字最好有后缀".db",方便在第三方数据库工具上使用。 2. 主键必须以下划线开头,例如“_id”,原因在于适配器,例如像ListView的适配器只通过下划线去找主键。 3. 操作完之后,记得手动关闭游标Cursor和数据库。 ----------------------- --Cursor是Android查询数据后得的一个管理数据集合的类,正常情况下,如果查询得到的数据量较小时不会有内存的问题,而且虚拟机能够保证Cursor最终会被释放掉。 --然而,如果Cursor的数据量特别大,特别是如果里面有Blob信息的时候,应该保证Cursor占用的内存被及时地清理掉,而不是等待GC来处理。并且Android明显是倾向于编程者手动地将Cursor关闭,因为在源码中我们发现,如果等到垃圾回收器来回收,也就是如果不手动关闭,系统就会报错,会给用户以错误提示。 ------------------------ 如图,游标接口 Cursor 的一些方法查看全部
-
在Android中如何使用SQlite,主要通过如下两个类: --SQLiteDatabase --SQLiteOpenHeplper查看全部
-
SQLite常用的查询语句查看全部
-
SQLite是用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。 SQLite:轻量级、性能不错,管理成本小。在管理、维护方面都非常出色,功能强大。 ——支持高达2TB大小的数据库 ——以单个文件的形式存在 ——以B-Tree的数据结构形式存储在磁盘 特点主要包括: 1.轻量级:一个动态库、单文件 2.独立性:没有依赖,无需安装 3.隔离性:全部在一个文件夹中 4.跨平台:支持众多操作系统 5.多语言接口:支持众多编程语言 6.安全性:事务(在下面细说) 关于事务处理的安全性问题: ---通过数据库的排它锁和共享锁来实现独立的事务处理 ---多个进程可以在同一时间内从同一个数据库读取数据,但只有一个可以写入数据(保证数据的一致性,但也牺牲了效率) 基本满足移动的、嵌入设备的开发。 -------------------- SQLite支持的数据类型: NULL、INTEGER、REAL、TEXT、BLOB。分别表示 空值、整型、浮点型、字符串型、二进制对象。 有意思的是,它既然支持多种编程语言,但有的语言是没有像REAl或者BLOB这样的数据类型,要怎么解决呢?那就是采用“弱引用”,也叫动态数据类型。 动态数据类型(弱引用): ---当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。 但最好不要使用不支持的类型。 ----------------------- 使用须知: ---由于资源占有少、性能良好和零管理成本,嵌入式数据库有了它的用武之地。例如Android、IOS。 ---没有可用于 SQLite 的网络服务器、只能通过网络共享,可能存在文件锁定(Windows)或者性能问题。 ---只提供数据库级的锁定。 ---没有用户账户的概念,而是根据文件系统确定所有数据库的权限。查看全部
举报
0/150
提交
取消