免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2074 | 回复: 0
打印 上一主题 下一主题

android 数据库流程分析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-11 02:31 |只看该作者 |倒序浏览
数据库流程分析
通过intent 添加或者编辑contact
intent = new Intent(Intent.ACTION_INSERT, People.CONTENT_URI);
intent = new Intent(Intent.ACTION_EDIT,
                        ContentUris.withAppendedId(People.CONTENT_URI, id));
intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(intent);                        
EditContactActivity.java (packages\apps\contacts\src\com\android\contacts)
protected void onCreate(Bundle icicle)
  buildEntriesForInsert(getIntent().getExtras());
  
   doSaveAction
     save()
       mResolver.insert(entry.uri, values);
EditContactActivity.java (packages\apps\contacts\src\com\android\contacts)文件类
public final class EditContactActivity extends Activity implements View.OnClickListener,
        TextWatcher, View.OnFocusChangeListener 中有:
ContentResolver mResolver;
public abstract class ContentResolver
public final Uri insert(Uri url, ContentValues values)
  IContentProvider provider = acquireProvider(url);
  return provider.insert(url, values);
调用:
===========================
public abstract class ContentProvider implements ComponentCallbacks
  class Transport extends ContentProviderNative
    public Uri insert(Uri uri, ContentValues initialValues)
      return ContentProvider.this.insert(uri, initialValues)
    public int bulkInsert(Uri uri, ContentValues[] initialValues)
      return ContentProvider.this.insert(uri, initialValues)
  public int bulkInsert(Uri uri, ContentValues[] initialValues)
public abstract class SyncableContentProvider extends ContentProvider
public abstract class AbstractSyncableContentProvider extends SyncableContentProvider
===========================
  public final Uri insert(final Uri url, final ContentValues values)
    result = insertInternal(uri, values);
  public final int bulkInsert(final Uri uri, final ContentValues[] values)
    Uri result = insertInternal(url, values);
因为:
public class ContactsProvider extends AbstractSyncableContentProvider
所以:
Uri result = insertInternal(url, values);执行的是 ContactsProvider 类中的
public Uri insertInternal(Uri url, ContentValues initialValues)函数
  final SQLiteDatabase db = getDatabase();
  int match = sURIMatcher.match(url);
  switch(match)
  case PEOPLE_OWNER:
    return insertOwner(initialValues);
  case PEOPLE_RAW:
  case PEOPLE:
    rowID = mPeopleInserter.insert(mValues);
因为 ContactsProvider 类中有:
private DatabaseUtils.InsertHelper mPeopleInserter;
public class DatabaseUtils
  public static class InsertHelper
    public long insert(ContentValues values)
      private synchronized long insertInternal(ContentValues values, boolean allowReplace)
        QLiteStatement stmt = getStatement(allowReplace);
        return stmt.executeInsert();
          native_execute();
本地调用:
android_database_SQLiteStatement.cpp (frameworks\base\core\jni)
static void native_execSQL(JNIEnv* env, jobject object, jstring sqlString)
  jchar const * sql = env->GetStringChars(sqlString, NULL);
  jsize sqlLen = env->GetStringLength(sqlString);
  err = sqlite3_prepare16_v2(handle, sql, sqlLen * 2, &statement, NULL);
完成数据库操作。
public class CalendarProvider extends AbstractSyncableContentProvider

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/49742/showart_1923918.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP