当前位置:操作系统 > 安卓/Android >>

解读Content Provider之二

修改数据
   可以通过如下方法修改被content provider保存的数据:
   1.添加新的记录;
   2.为已经存在的数据添加新值;
   3.批量更新已经存在的记录;
   4.删除记录
   所有的数据修改操作都可以通过ContentResolver的方法来完成。一些content provider在修改数据的时候要求拥有比读取数据拥有更多的权限。如果没有修改content provider数据的权限,那么ContentResolver的方法就会失效。
  添加记录
   为了添加新的记录到content provider中,首先在ContentValues对象中设置键-值对,设置的键和content provider中的列名对应,并且值的内容就是我们想为新记录设置值。然后,通过调用ContentResolver.insert()方法,并且将要处理的content provider和设置好的ContentValues键-值对作为参数传递给这个方法。这个方法将会返回新纪录的完整的URI——也就是,要操作的provider的URI加上为新记录追加的ID号。然后,你可以用这个完整的URI来进行查询操作,获得一个指向这个新记录的Cursor,并且利用这个得到的Cursor进行后续的修改记录的操作。如下例:
    import android.provider.Contacts.People; 
import android.content.ContentResolver; 
import android.content.ContentValues;  
 
 
ContentValues values = new ContentValues(); 
 
 
// Add Abraham Lincoln to contacts and make him a favorite.  
values.put(People.NAME, "Abraham Lincoln"); 
// 1 = the new contact is added to favorites  
// 0 = the new contact is not added to favorites  
values.put(People.STARRED, 1); 
 
 
Uri uri = getContentResolver().insert(People.CONTENT_URI, values); 
    import android.provider.Contacts.People;
 import android.content.ContentResolver;
 import android.content.ContentValues;


 ContentValues values = new ContentValues();


 // Add Abraham Lincoln to contacts and make him a favorite.
 values.put(People.NAME, "Abraham Lincoln");
 // 1 = the new contact is added to favorites
 // 0 = the new contact is not added to favorites
 values.put(People.STARRED, 1);


 Uri uri = getContentResolver().insert(People.CONTENT_URI, values);  添加新的值
    如果一条记录已经存在,你可以添加新的信息到其中或者是修改已经存在的信息。例如:上面例子的下一步就是添加新的联系信息——例如一个电话号码或者是一个IM帐号再或者是邮箱的地址——到新的条目中。
    向Contacts数据库中添加新纪录的最好的方法就是追加表名到存储新纪录的URI后,然后用修改过的URI来添加新的数据值。每一个Contacts表都会暴露出一个名字作为CONTENT_DIRECTORY常量。接下来的代码是接着上面的例子,要为新创建的记录添加一个电话号码和一个邮箱地址。
Uri phoneUri = null; 
Uri emailUri = null; 
 
 
// Add a phone number for Abraham Lincoln.  Begin with the URI for  
// the new record just returned by insert(); it ends with the _ID  
// of the new record, so we don't have to add the ID ourselves.  
// Then append the designation for the phone table to this URI,  
// and use the resulting URI to insert the phone number.  
phoneUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY); 
 
 
values.clear(); 
values.put(People.Phones.TYPE, People.Phones.TYPE_MOBILE); 
values.put(People.Phones.NUMBER, "1233214567"); 
getContentResolver().insert(phoneUri, values); 
 
 
// Now add an email address in the same way.  
emailUri = Uri.withAppendedPath(uri, People.ContactMethods.CONTENT_DIRECTORY); 
 
 
values.clear(); 
// ContactMethods.KIND is used to distinguish different kinds of  
// contact methods, such as email, IM, etc.   
values.put(People.ContactMethods.KIND, Contacts.KIND_EMAIL); 
values.put(People.ContactMethods.DATA, "test@example.com"); 
values.put(People.ContactMethods.TYPE, People.ContactMethods.TYPE_HOME); 
getContentResolver().insert(emailUri, values); 
 Uri phoneUri = null;
 Uri emailUri = null;


 // Add a phone number for Abraham Lincoln.  Begin with the URI for
 // the new record just returned by insert(); it ends with the _ID
 // of the new record, so we don't have to add the ID ourselves.
 // Then append the designation for the phone table to this URI,
 // and use the resulting URI to insert the phone number.
 phoneUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY);


 values.clear();
 values.put(People.Phones.TYPE, People.Phones.TYPE_MOBILE);
 values.put(People.Phones.NUMBER, "1233214567");
 getContentResolver().insert(phoneUri, values);


 // Now add an email address in the same way.
 emailUri = Uri.withAppendedPath(uri, People.ContactMethods.CONTENT_DIRECTORY);


 values.clear();
 // ContactMethods.KIND is used to distinguish different kinds of
 // contact methods, such as email, IM, etc.
 values.put(People.ContactMethods.KIND, Contacts.KIND_EMAIL);
 values.put(People.ContactMethods.DATA, "test@example.com");
 values.put(People.ContactMethods.TYPE, People.ContactMethods.TYPE_HOME);
 getContentResolver().insert(emailUri, values);

    你可以通过调用ContentValues.put()方法通过一个byte类型的数组将少量的二进制数据加入到表中。例如:这种方法对小的图标类型的图片和短小的音频文件是十分有效的。然而,如果你有比较大的二进制数据要添加,例如一个图片文件和一首完整的歌曲,为这个要添加的数据这是一个content:URI,然后调用ContentResolver.openOutputStream()方法,并且这个文件的URI作为这个方法的参数。(这将使得content provider使用文件来存储这些数据,并且将文件文件的路径记录在这条记录的一个隐含的域中)
    在这方面,MediaStore content provider独立于图片、音频和视频文件的主要的provider,这就提供了一个便利:我们可以通过query()和managedQuery()使用一样的URI来获取二进制数据(例如:捕获到的图片)的信息,我们可以通过openInputStream()方法和刚刚获得的二进制数据的信息来获取这些二进制数据,下面的代码就显示了这个便利之处:
import android.provider.MediaStore.Images.Media; 
import android.content.ContentValues; 
import java.io.OutputStream; 
 
 
// Save the name and description of an image in a ContentValues map.    
ContentValues values = new ContentValues(3); 
values.put(Media.DISPLAY_NAME, "road_trip_1"); 
values.put(Media.DESCRIPTION, "Day 1, trip to Los Angeles"); 
values.put(Media.MIME_TYPE, "image/jpeg"); 
 
 
// Add a new record without the bitmap, but with the values just set.  
// insert() returns the URI of the new record.  
Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 
 
 
// Now get a handle to the file for that record, and save the data into it.  
// Here, sourceBitmap is a Bitmap object representing the file to save to the database.  
try { 
    OutputStream outStream = getContentResolver().openOutputStream(uri); 
    sourceBitmap.compress(Bitmap.CompressFormat.JPEG, 50, outStream); 
    outStream.close(); 
} catch (Exception e) { 
    Log.

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,