andoird---loadermanager和contentprovider结合,加载数据

本人是刚入android的菜鸟,如果下面有写的不对的地方,特别欢迎纠正。

先说说对loadermanager的理解,loadermanager是对loader进行管理,而loader的作用就是“异步”加载数据,也就是说loader相当于有两个功能(这种说法比较牵强),一个是查询功能,另一种是异步,这样做的好处是ui加载与数据加载分离,效率方面的到很大提升。而loadermanager的功能是监听(monitor)loader的数据,同时将数据的变化返回到ui,进行展现,这里用到了一种设计模式----观察者设计模式。

对于contentprovider,就类似于创建一个“服务器”,“服务器”需要地址访问,同时需要对地址进行解析,同时需要对数据(如:数据库等),进行CRUD操作。总之,contentprovider作用:1.对地址进行解析   2.CRUD 操作  3.添加访问地址  等


好了废话不多说上代码。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android_contentprovdier_loadermanager"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <!-- 添加访问路径 -->
        <provider android:name=".MyProvider" 
            android:authorities="com.example.android.MyProvider"
            ></provider>
    </application>

</manifest>
DBHelper.java

package com.example.android_contentprovdier_loadermanager.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {
	private final static String name = "mydb1.db";
	private final static int version = 1;
	
	public DBHelper(Context context) {
		super(context, name, null, version);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "create table person(_id integer primary key autoincrement, name varchar(64), address varchar(64))";
		db.execSQL(sql);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		
	}
}
MyProvider.java

package com.example.android_contentprovdier_loadermanager;

import com.example.android_contentprovdier_loadermanager.db.DBHelper;

import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class MyProvider extends ContentProvider {
	private DBHelper helper;
	private ContentResolver resolver;
	private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
	private final static int PERSON = 1;
	private final static int PERSONS = 2;
	
	static {
		matcher.addURI("com.example.android.MyProvider", "person", PERSON);
		matcher.addURI("com.example.android.MyProvider", "person/*", PERSONS);
	}

	@Override
	public boolean onCreate() {
		helper = new DBHelper(getContext());
		resolver = getContext().getContentResolver();
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
		SQLiteDatabase database  = helper.getReadableDatabase();
		Cursor cursor = database.query("person", projection, selection, selectionArgs, null, null, sortOrder);
		resolver.notifyChange(uri, null);
		return cursor;
	}

	@Override
	public String getType(Uri uri) {
		int match = matcher.match(uri);
		switch(match) {
		case PERSON:
			return "vnd.android.cursor.item/person";
		case PERSONS:
			return "vnd.android.cursor.dir/person";
		}
		
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		SQLiteDatabase database = helper.getWritableDatabase();
		
		int match = matcher.match(uri);
		switch (match) {
		case PERSON:
			long key = database.insert("person", null, values);
			Uri uri1 = ContentUris.withAppendedId(uri, key);
			resolver.notifyChange(uri1, null);
			return uri1;
		case PERSONS:
			
			break;
		}
		
		return null;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		return 0;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
		return 0;
	}

}

MainActivity.java

package com.example.android_contentprovdier_loadermanager;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {
	private Button button1;
	private ListView listView1;
	private LoaderManager manager;
	private MyAdapter adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button1 = (Button) this.findViewById(R.id.button1);
		listView1 = (ListView) this.findViewById(R.id.listView1);
		button1.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				ContentResolver resolver = MainActivity.this.getContentResolver();
				ContentValues values = new ContentValues();
				values.put("name", "你好");
				values.put("address", "济南");
				Uri uri = Uri.parse("content://com.example.android.MyProvider/person");
			
				resolver.insert(uri, values);
				
				//重启loadermanager,告诉它重新加载数据
				manager.restartLoader(101, null, MainActivity.this);
			}
		});
		
		manager = getLoaderManager();
		//mainactivity实现loadCallback接口,所以这边的callback用this
		manager.initLoader(101, null, this);
	}
	
	public class MyAdapter extends BaseAdapter {
		private List<String> list;
		
		public MyAdapter(List<String> list) {
			this.list = list;
		}

		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public Object getItem(int position) {
			return list.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			TextView textView1 = null;
			
			if(convertView != null) {
				textView1 = (TextView) convertView;
			} else {
				textView1 = new TextView(MainActivity.this);
			}
			
			textView1.setText(list.get(position));
			
			return textView1;
		}
		
	}

	//异步查询数据
	@Override
	public Loader<Cursor> onCreateLoader(int id, Bundle args) {
		CursorLoader loader = new CursorLoader(this);
		Uri uri = Uri.parse("content://com.example.android.MyProvider/person");
		loader.setUri(uri);
		loader.setProjection(new String[]{"address"});
		
		return loader;
	}

	//查询过后对数据进行遍历
	@Override
	public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
		List<String> list = new ArrayList<String>();
		int count = data.getColumnCount();
		while(data.moveToNext()) {
			for(int i=0; i<count; i++) {
				list.add(data.getString(i));
			}
		}
		
		adapter = new MyAdapter(list);
		listView1.setAdapter(adapter);
		
		adapter.notifyDataSetChanged();
	}

	@Override
	public void onLoaderReset(Loader<Cursor> loader) {
		
	}

	

}


如果有需要可以去csdn现在资料,我的资料完全免费http://download.csdn.net/detail/scqdscy1994/9713133








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值