`

为什么要引入ContentProvider

阅读更多
为什么要引入ContentProvider?
    Android提供了文件存储数据,文件的存储格式不受限制,但是这样不方便数据的管理。为了方便管理,我们一般采用xml文件存储数据。对于这样的数据操作,我们必须对其进行xml文件解析。 
    所以Android的Sharepreferences(共享参数的方式)由此诞生。它是xml文件的方式存储数据,存储在包下shared_prefs目录中,它提供了API方便我们对xml文件操作。
  但是文件和共享参数的方式虽然可以方便的存储数据,这样的文件要被其他应用访问,又要修该源代码,这样对我们造成了不便。
  所以ContentProvider由此应运而生。ContentProvider只需向外提供域名,其他应用通过相应的API即可对其操作。


文件方式如下:

public class SharePreferencesActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final SharedPreferences sharedPreferences = getSharedPreferences("jefry", Context.MODE_APPEND);
        
        Button save = (Button)findViewById(R.id.save);
        save.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				Log.i("SharePreferencesActivity", Thread.currentThread().getName());
				Editor editor = sharedPreferences.edit();
				EditText nameEd = (EditText) findViewById(R.id.filename);
				EditText content = (EditText) findViewById(R.id.content);
			    editor.putString("name",nameEd.getText().toString().trim());
			    editor.putInt("age", new Integer(content.getText().toString().trim()));
			    editor.commit();//提交修改
		       
			}
		  });
    }
}


Sharepreferences如下
public class SharePreferencesActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final SharedPreferences sharedPreferences =         getSharedPreferences("jefry", Context.MODE_APPEND);
        
        Button save = (Button)findViewById(R.id.save);
        save.setOnClickListener(new View.OnClickListener() {
			public void onClick(View arg0) {
				Log.i        ("SharePreferencesActivity", Thread.currentThread       ().getName());
				Editor editor =        sharedPreferences.edit();
				EditText nameEd = (EditText) findViewById(R.id.filename);
				EditText content = (EditText) findViewById(R.id.content);
			    editor.putString("name",nameEd.getText().toString().trim());
			    editor.putInt("age", new Integer(content.getText().toString().trim()));
			    editor.commit();//提交修改
		       
			}
		  });
    }
}


ContentProvider方式如下:


public class PersonContentProvider extends ContentProvider {

	private static final UriMatcher sMatcher = new UriMatcher(
			UriMatcher.NO_MATCH);

	static {
		sMatcher.addURI("com.contentprovider.personprovider", "person", 1);
		sMatcher.addURI("com.contentprovider.personprovider", "person/#", 2);
	}

	public static final Uri CONTENT_URI = Uri
			.parse("conten://com.contentprovider.personprovider/person");

	@Override
	public int delete(Uri uri, String arg1, String[] arg2) {

		return 0;
	}

	@Override
	public String getType(Uri uri) {
		switch (sMatcher.match(uri)) {
		case 1:
			return "vnd.android.cursor.dir/person"; // List of items.
		case 2:
			return "vnd.android.cursor.item/person"; // Specific item.
		default:
			return null;
		}
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		try {
			Log.i("PersonContentProvider", "type" + getType(uri));
			Log.i("PersonContentProvider", "insert test...");

		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public boolean onCreate() {
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] arg1, String arg2, String[] arg3,
			String arg4) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int update(Uri uri, ContentValues arg1, String arg2, String[] arg3) {
		// TODO Auto-generated method stub
		return 0;
	}

}

//其他应用访问ContentProvider
public class OutSideActivty extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ContentValues values = new ContentValues();
        values.put("name", "emily");
		 this.getContentResolver().insert(Uri.parse("content://com.contentprovider.personprovider/person"), values);
        setContentView(R.layout.main);
    }
}
分享到:
评论

相关推荐

    Android+Room+ContentProvider

    要使用Room,我们需要引入相应的依赖库,并定义数据库实体(Entities)、数据访问对象(DAOs)以及数据库抽象类(Database)。例如: ```java @Entity public class User { @PrimaryKey private int id; private...

    SQLiteOpenHelper和ContentProvider区别

    然而,SQLiteOpenHelper主要用于应用内部的数据管理,如果需要与其他应用共享数据,就需要引入ContentProvider。 ContentProvider是Android四大组件之一,它提供了一种标准的方式来存储和检索数据,并且使得不同...

    实验8 contentProvider共享数据1

    在实验的第一部分,你需要在实验7的基础上修改应用程序,创建一个名为`Lab8ContentProvider`的`ContentProvider`。这个`ContentProvider`需要继承自`android.content.ContentProvider`类,并实现其关键方法,如`...

    ContentProvider工具类

    1. 在项目中引入ContentProvider工具类,根据需要进行必要的修改,如设置URI、数据表名等。 2. 调用工具类提供的静态方法进行数据操作,例如: ```java ContentValues values = new ContentValues(); values.put(...

    ContentProvider使用demo(Eclipse)

    通过这个简单的例子,开发者可以进一步了解ContentProvider的工作原理,为后续更复杂的自定义ContentProvider开发打下基础。同时,理解并掌握ContentProvider的使用,对于开发需要共享数据的应用来说,具有重要的...

    Contentprovider

    首先,我们要明白ContentProvider的基本工作原理。每个ContentProvider都有一个唯一的URI(统一资源标识符),通过这个URI,其他应用可以定位并请求数据。Android系统提供了标准的ContentResolver类,用于与...

    android 内容提供者 ContentProvider

    ContentProvider的引入使得数据的共享更加规范,避免了直接暴露数据库文件的安全风险。同时,由于数据访问通过ContentProvider,开发者可以灵活地控制数据操作的逻辑,比如进行复杂的查询、事务处理等。 总的来说,...

    Android应用程序组件Content Provider的共享数据更新通知机制分析.doc

    当数据发生更新时,为了确保所有依赖该数据的应用都能及时获取到最新的信息,Android引入了一种数据更新通知机制。 Content Provider的数据更新通知机制与Android系统的广播通知机制有相似之处,但也有明显的区别。...

    Android7.0中关于ContentProvider组件详解

    尽管ContentProvider在系统层面提供了数据共享的统一接口,但存在一个潜在的问题:如果提供者进程已经结束,其他进程试图访问ContentProvider时,系统会重新启动该进程,这可能导致不必要的延迟和资源消耗。...

    android高仿QQ音乐播放器

    当设置MediaPlayer的setLooping方法为true时,音乐将在播放结束后自动重播。 来电暂停和通话结束恢复播放涉及到Android的电话监听。需要注册BroadcastReceiver来监听ACTION_PHONE_STATE广播,当检测到电话状态改变...

    android 电话本 Phonebook

    例如,我们可以定义一个名为`PhonebookProvider`的类,并在`onCreate()`方法中进行初始化操作,确保ContentProvider正确运行。 接下来,我们需要定义URI模式,以便应用程序能够正确地与ContentProvider交互。这些...

    simpleprovider:编写适用于Android应用的ContentProviders和SQL数据库的简单方法

    为Android应用程序创建简单的ContentProvider,以减少样板代码。 目标 在Android应用程序中编写内容提供程序确实很烦人。 在大多数情况下,数据方面没有太多复杂性。 尽管如此,您仍然必须编写大量样板代码才能开始...

    Android开发WebView获取SD卡图片并显示

    - 当使用`addJavascriptInterface()`时,要注意防止跨域攻击。从Android 4.2开始,可以通过`@JavascriptInterface`注解标记方法,防止恶意代码调用。 通过以上步骤,你可以成功地在Android 4.4及更高版本的WebView...

    当ContentProcider共享的数据有变化时通知使用共享的应用

    3. **观察者模式**:为了实现数据变更的通知,Android引入了ContentObserver类。ContentObserver是一个观察者对象,它可以注册到ContentResolver上,监听特定Uri的变化。当ContentProvider中的数据发生变化时,系统...

    Detecting Passive Content Leaks and Pollution in Android Applications

    另外,从Android 6.0(API级别23)开始引入的运行时权限,使得应用在安装后可以请求额外的权限,从而为用户提供更好的控制权,并增强应用的安全性。 文章强调了在Google Play商店等流行的Android应用市场中,大量...

    Android 高仿基于android2.2(Froyo)的Contacts源码.zip

    10. **数据访问优化**:为了提高性能,Contacts源码中可能包含缓存机制,如LruCache,用于缓存最近查询的结果,减少不必要的数据库访问。 通过深入研究Android 2.2 Froyo的Contacts源码,开发者可以学习如何高效地...

    安卓Android源码——Android导入导出txt通讯录工具.zip

    这个名为“安卓Android源码——Android导入导出txt通讯录工具”的压缩包提供了一个实用的解决方案,它允许用户将他们的联系人信息导出为纯文本(TXT)格式,同时也可以从TXT文件中导入联系人到手机中。下面我们将...

    Android开发之多进程架构 任玉刚.pdf

    #### 为什么要采用多进程? 采用多进程架构有其明显的优势,首先它可以帮助突破单进程的内存限制,降低程序崩溃(out of memory, oom)的概率。其次,多进程可以降低每个常驻进程的内存占用,通过合理的进程管理,...

    android-StorageProvider.zip_android

    在Android系统中,存储访问框架(Storage Access Framework, SAF)是一个重要的组件,它为应用程序提供了一种统一的方式来访问和管理用户的文件,无论这些文件存储在内部存储、外部存储还是网络位置。这个“android-...

    androidN 7.0安装APK方法

    在Android N 7.0(API级别24)中,Google引入了更严格的安全策略,以保护用户数据和隐私。这个变化对开发者来说是一个重要的里程碑,因为它强制要求正确处理文件URI,尤其是当应用试图通过Intent分享文件时。在这个...

Global site tag (gtag.js) - Google Analytics