Android数据篇(二)

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);
	}

	// 首次创建数据库的时候调用 一般可以把建库 建表的操作
	@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('zhangsan', 'female', 18)");
	}

	// 当数据库的版本发生变化的时候 会自动执行
	@Override
	public 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/<package name>/files目录

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



        File file = new File("/mnt/sdcard/test");
        if (!file.exists()) {
        	try {
				file.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.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/<package name>/files),其他程序无法访问。除非在创建时指定了MODE_WORLD_READABLE或者

MODE_WORLD_WRITEABLE。



ContentProvider

.如何实现ContentProvider?

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

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



<provider

android:name="com.example.MusicProvider"

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

</provider>


注:注册的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指定的条件所匹配的全部记录
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		return 0;
	}

	// 返回当前uri的MIME类型,如果该URI对应的数据可能包括多条记录
	// 那么MIME类型字符串 就是以vnd.android.dir/开头
	// 如果该URI对应的数据只有一条记录 该MIME类型字符串 就是以vnd.android.cursor.item/开头
	@Override
	public String getType(Uri uri) {
		return null;
	}

	// 根据Uri插入Values对应的数据
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		return null;
	}

	// 在COntentProvider创建后被调用
	@Override
	public boolean onCreate() {
		return false;
	}

	// 根据uri查询出selection指定的条件所匹配的全部记录,并且可以指定查询哪些列 以什么方式(order)排序
	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
			String sortOrder) {
		return null;
	}

	// 根据uri修改selection指定的条件所匹配的全部记录
	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		return 0;
	}

}




<uses-permission android:name="android.permission.READ_CONTACTS"/>


        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();
        }



    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_CONTACTS"/>



        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);







你可能感兴趣的:(数据库,android,ContentProvider,sqlite,数据处理)