SQLiteOpenHelper:


- SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新

- 一般是建立一个类继承它,并重写onCretae()和onUpgrade()方法

- 方法说明

onCreate(SQLiteDatabase db) 创建数据库时调用

onUpgrade(SQLiteDatabase db, int oldVersion, int new Version) 版本更新时调用

getReadableDatabase() 创建或打开一个只读数据库

getWritableDatabase() 创建或打开一个读写数据库


public class DBOpenHelper extends SQLiteOpenHelper {public DBOpenHelper(Context context, String name) {super(context, name, null, 1);}// 首次创建数据库的时候调用 一般可以把建库 建表的操作@Overridepublic 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('zhangsan', 'female', 18)");}// 当数据库的版本发生变化的时候 会自动执行@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}



        DBOpenHelper helper = new DBOpenHelper(MainActivity.this, "stu.db");//        helper.getReadableDatabase(); // 获取一个只读的数据库 只能查询 不能写入 不能更新        SQLiteDatabase db = helper.getWritableDatabase();        Cursor c = db.rawQuery("select * from stutb", null);        if (c != null) {        String[] cols = c.getColumnNames();        while (c.moveToNext()) {        for(String ColumnName : cols) {        Log.i("info", ColumnName + " : " + c.getString(c.getColumnIndex(ColumnName)));        }        }        c.close();        }        db.close();



Android中文件存储的操作:


-Activity的openFileOutput()方法可以用于把数据输出到文件中

-创建的文件保存在/data/data//files目录

-实现过程与在Java中保存数据到文件中是一样的



        File file = new File("/mnt/sdcard/test");        if (!file.exists()) {        try {file.createNewFile();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}        } else {        Toast.makeText(MainActivity.this, "exists", 1000);        }        file.delete();



MODE_PRIVATE

-为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容


MODE_APPEND

-模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件


MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE

-用来控制其他应用是否有权限读写该文件



        // 这个目录是当前应用程序默认的数据存储目录//        File file = this.getFilesDir(); // /data/data/com.example.filedemo/files//        File file = this.getCacheDir(); // 这个目录是当前应用程序默认的缓存文件的存放位置//        // 把一些不是非常重要的文件在此处创建 使用//        // 如果手机的内存不足的时候 系统会自动去删除App的cache目录的数据//        Log.i("info", file.toString());        // /data/data/<包名>/app_a//        File file = this.getDir("a", MODE_PRIVATE);    //        Log.i("info", file.toString());//        this.getExternalFilesDir(type);        // 可以得到外部的存储位置 该位置的数据跟内置的使用是一样的        // 如果App卸载了 这里面的数据也会自动清除掉        File file = this.getExternalCacheDir();        Log.i("info", file.toString());        // 如果开发者不遵守这样的规则 不把数据放入data/data/<包名>        // /mnt/sdcard/Android/data/<包名>        // 卸载之后数据将不会自动清除掉 将会造成所谓的数据垃圾



    // 保存文件内容    public void WriteFiles(String content) {    // MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE    try {FileOutputStream fos = openFileOutput("a.txt", MODE_PRIVATE);fos.write(content.getBytes());fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}    }        // 读取文件内容    public String readFiles() {    String content = null;    try {FileInputStream fis = openFileInput("a.txt");ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = fis.read(buffer)) != -1) {baos.write(buffer, 0, len);}content = baos.toString();fis.close();baos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}        return content;    }


当应用程序在安装时系统就会分配给它一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,

sharedpreferences,数据库都应该是私有的(位于/data/data//files),其他程序无法访问。除非在创建时指定了MODE_WORLD_READABLE或者

MODE_WORLD_WRITEABLE。



ContentProvider

.如何实现ContentProvider?

1.继承抽象类ContentProvider实现一系列针对于数据的增删改查等方法;

2.需在AndroidMainfest.xml中完成对ContentProvider的注册。



android:name="com.example.MusicProvider"

android:authorities="com.provider.music" >


注:注册的authorities属性值是全局唯一的



UriMatcher类

- UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);

.  UriMatcher.NO_MATCH 表示不匹配任何路径的返回码


- matcher.addURI("com.example.provider", "music", 1);

.  往UriMatcher类里添加一个拼凑的Uri

.  UriMatcher为一个Uri容器,容器里面包含着我们即将可能要操作的Uri

.  如果通过match()方法匹配成功就返回code值


- matcher.match(uri)

.  首先与通过addURI()方法添加进来的Uri匹配

.  匹配成功则返回设置的code1值,反之,返回一个UriMatcher.NO_MATCH常量(-1)




ContentResolver:

- 使用ContentResolver操作ContentProvider中的数据:

.  当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver类来完成

.  使用Activity提供的getContentResolver()方法获取ContentResolver对象



public class MyContentProvider extends ContentProvider {// 根据Uri删除selection指定的条件所匹配的全部记录@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {return 0;}// 返回当前uri的MIME类型,如果该URI对应的数据可能包括多条记录// 那么MIME类型字符串 就是以vnd.android.dir/开头// 如果该URI对应的数据只有一条记录 该MIME类型字符串 就是以vnd.android.cursor.item/开头@Overridepublic String getType(Uri uri) {return null;}// 根据Uri插入Values对应的数据@Overridepublic Uri insert(Uri uri, ContentValues values) {return null;}// 在COntentProvider创建后被调用@Overridepublic boolean onCreate() {return false;}// 根据uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列 以什么方式(order)排序@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,String sortOrder) {return null;}// 根据uri修改selection指定的条件所匹配的全部记录@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {return 0;}}






        ContentResolver cr = getContentResolver();        // ContactsContract.Contacts        Cursor c = cr.query(Contacts.CONTENT_URI, new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);        if (c != null) {        while (c.moveToNext()) {        int id = c.getInt(c.getColumnIndex("_id"));        Log.i("info", "_id : " + id);        // 或使用上面的常量Contacts._ID、Contacts.DISPLAY_NAME等        Log.i("info", "name : " + c.getString(c.getColumnIndex("display_name")));        Cursor c1 = cr.query(Phone.CONTENT_URI, new String[]{Phone.NUMBER, Phone.TYPE}, Phone.CONTACT_ID + "=" + id, null, null);        // 根据联系人ID查询出联系人的电话号码        if (c1 != null) {        while (c1.moveToNext()) {        int type = c1.getInt(c1.getColumnIndex(Phone.TYPE));        if (type == Phone.TYPE_HOME) {        Log.i("info", "home phone number : " + c1.getString(c1.getColumnIndex(Phone.NUMBER)));        } else if (type == Phone.TYPE_MOBILE) {        Log.i("info", "mobile phone : number " + c1.getString(c1.getColumnIndex(Phone.NUMBER)));        }        }        c1.close();        }        // 根据联系人的ID去查询出联系人的邮箱地址        Cursor c2 = cr.query(Email.CONTENT_URI, new String[]{Email.DATA, Email.TYPE}, Email.CONTACT_ID + "=" + id, null, null);        if (c2 != null) {        while (c2.moveToNext()) {        int type = c2.getInt(c2.getColumnIndex(Email.DATA));        if (type == Email.TYPE_WORK) {        Log.i("info", "work email : " + c1.getString(c2.getColumnIndex(Email.DATA)));        }        }        c2.close();        }        }        c.close();        }



   
   



        ContentResolver cr = getContentResolver();        // 向联系人中 插入一行数据        ContentValues values = new ContentValues();        Uri uri = cr.insert(RawContacts.CONTENT_URI, values);        Long raw_contact_id = ContentUris.parseId(uri);        values.clear();        // 插入人名        values.put(StructuredName.RAW_CONTACT_ID, raw_contact_id);        values.put(StructuredName.DISPLAY_NAME, "zhangsansan");        values.put(StructuredName.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);        uri = cr.insert(Data.CONTENT_URI, values);        // 插入电话信息        values.clear();        values.put(Phone.RAW_CONTACT_ID, raw_contact_id);        values.put(Phone.NUMBER, "13333333333333");        values.put(Phone.MIMETYPE, Phone.CONTENT_ITEM_TYPE);        uri = cr.insert(Data.CONTENT_URI, values);







更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
  4. Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
  5. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  6. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  7. 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
  8. nfs: server 192.168.0.3 not responding, still trying
  9. android NDK学习篇5之hello-jni——jni中头文件的自动生成

随机推荐

  1. mysql 拆分字符串,并count出字符串的长度
  2. 如何使用嵌入式SQL迭代RPG(LE)中的一组记录
  3. 【MySQL】事务没有提交导致 锁等待Lock w
  4. sql grouping with rollup 按部门 合并一
  5. 为什么这个简单的连接查询使用子查询明显
  6. jdbc与mysql之"can't get hostname four
  7. mysql使用kill无法杀死进程
  8. Qt中使用mysql连接远程服务器
  9. SQL 函数如何设置参数默认值
  10. SQL Server更新一行阻止