contentProvider简单实现数据库的增删改查

若要实现contentProvider程序,则需要实现以下接口和类




实现的代码如下1、DatabaseMetaData

package com.jackie.membercontentprovider;

import android.net.Uri;
import android.provider.BaseColumns;

public interface DatabaseMetaData {
	//这是外部访问的Authority,content地址为:content://com.jackie.membercontentprovider
     public static final String AUTHORITY="com.jackie.membercontentprovider";
     //数据库的名称
     public static final String DATABASE_NAME="jackie";
     //数据库的版本
     public static final int VERSION=1;
     //建立表元数据接口
     public static interface MemberTableMetaData extends BaseColumns{
    	 //建立表名称
    	 public static final String TABLE_NAME="member";
    	 //外部访问表的链接
    	 public static final Uri CONTENT_URI=Uri.parse("content://"+AUTHORITY+"/"+TABLE_NAME);
    	 //查询得到表全部内容
    	 public static final String CONTACT_LIST="vnd.android.cursor.dir/vnd.jackiecontentprovider.member";
    	 //取得表中部分信息,相当于按ID查询
    	 public static final String CONTACT_ITEM="vnd.android.cursor.item/vnd.jackiecontentprovider.member";
    	 
    	 public static final String MEMBER_NAME="name";
    	 public static final String MEMBER_AGE="age";
    	 public static final String MEMBER_BIRTHDAY="brithday";
    	 
    	 public static final String SORT_ORDER="_id DESC"; //排序操作
    	 
     }
     
}

2、数据库操作类 MyDatabaseHelper

package com.jackie.membercontentprovider;

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

public class MyDatabaseHelper extends SQLiteOpenHelper {

	public MyDatabaseHelper(Context context) {
		super(context, DatabaseMetaData.DATABASE_NAME, null,
				DatabaseMetaData.VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {

		String sql = "CREATE TABLE "

		+ DatabaseMetaData.MemberTableMetaData.TABLE_NAME + " ( "

		+ DatabaseMetaData.MemberTableMetaData._ID

		+ " INTEGER PRIMARY KEY,"

		+ DatabaseMetaData.MemberTableMetaData.MEMBER_NAME

		+ " VARCHAR(50) NOT NULL,"

		+ DatabaseMetaData.MemberTableMetaData.MEMBER_AGE

		+ " INTEGER NOT NULL,"
		+ DatabaseMetaData.MemberTableMetaData.MEMBER_BIRTHDAY

		+ " VARCHAR(50) NOT NULL" + " )";
		db.execSQL(sql);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		String sql = "DROP TABLE IF EXISTS"
				+ DatabaseMetaData.MemberTableMetaData.TABLE_NAME;
		db.execSQL(sql);
		this.onCreate(db);
	}

}

3、contentProvider 表的具体实现类,服务器端

package com.jackie.membercontentprovider;

import android.content.ContentProvider;
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 MemberContentProvider extends ContentProvider {
	private static UriMatcher uriMatcher = null; // 地址转换
	private static final int GET_MEMBER_LIST = 1; // 得到全部的数据
	private static final int GET_MEMBER_ITEM = 2; // 取得一个数据
	private MyDatabaseHelper helper = null;
	static { // 静态代码块
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); // 实例化对象
		uriMatcher.addURI(DatabaseMetaData.AUTHORITY,
				DatabaseMetaData.MemberTableMetaData.TABLE_NAME,
				GET_MEMBER_LIST); // 取得全部数据的匹配地址
		uriMatcher.addURI(DatabaseMetaData.AUTHORITY,
				DatabaseMetaData.MemberTableMetaData.TABLE_NAME + "/#",
				GET_MEMBER_ITEM); // 取得一个数据的匹配地址

	}

	@Override
	public String getType(Uri uri) { // 取得数据类型
		switch (uriMatcher.match(uri)) { // 匹配传入进来的Uri类型
		case GET_MEMBER_LIST:
			return DatabaseMetaData.MemberTableMetaData.CONTACT_LIST;
		case GET_MEMBER_ITEM:
			return DatabaseMetaData.MemberTableMetaData.CONTACT_ITEM;
		default:
			throw new UnsupportedOperationException("Not Support Operation:"
					+ uri);
		}
	}

	@Override
	public boolean onCreate() { // 取得hepler类的对象
		this.helper = new MyDatabaseHelper(super.getContext());
		return true; // 表示操作成功了
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		SQLiteDatabase db = this.helper.getWritableDatabase(); // 以写方式打开数据库
		int result = 0; // 操作结果
		switch (uriMatcher.match(uri)) {
		case GET_MEMBER_LIST:
			result = db.delete(DatabaseMetaData.MemberTableMetaData.TABLE_NAME,
					selection, selectionArgs);
			break;
		case GET_MEMBER_ITEM:
			long id = ContentUris.parseId(uri); // 找到里面的id
			String where = "_id=" + id;
			result = db.delete(DatabaseMetaData.MemberTableMetaData.TABLE_NAME,
					where, selectionArgs);
			break;
		default:
			throw new UnsupportedOperationException("Not Support Operation:"
					+ uri);
		}
		return result;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) { // 传过来的地址
							// ***content://com.jackie.membercontentprovider/member
		SQLiteDatabase db = this.helper.getWritableDatabase(); // 以写方式打开数据库
		long id = 0; // 取得增加数据后的id
		switch (uriMatcher.match(uri)) {
		case GET_MEMBER_LIST:
			id = db.insert(DatabaseMetaData.MemberTableMetaData.TABLE_NAME,
					DatabaseMetaData.MemberTableMetaData._ID, values);
			String uriPath = uri.toString();
			String path = uriPath + "/" + id;
			return Uri.parse(path);

		case GET_MEMBER_ITEM:
			return null;
		default:
			throw new UnsupportedOperationException("Not Support Operation:"
					+ uri);
		}
	}

	@Override
	public Cursor query(Uri uri, String[] columns, String selection,
			String[] selectionArgs, String sortOrder) {
		SQLiteDatabase db = this.helper.getWritableDatabase(); // 以写方式打开数据库
		switch (uriMatcher.match(uri)) {
		case GET_MEMBER_LIST:
			return db.query(DatabaseMetaData.MemberTableMetaData.TABLE_NAME,
					columns, selection, selectionArgs, null, null, sortOrder);
		case GET_MEMBER_ITEM:
			long id=ContentUris.parseId(uri);  //查询的id
 			String where="_id"+id;
 			return db.query(DatabaseMetaData.MemberTableMetaData.TABLE_NAME,
					columns, where, selectionArgs, null, null, sortOrder);
		default:
			throw new UnsupportedOperationException("Not Support Operation:"
					+ uri);
		}

	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		SQLiteDatabase db = this.helper.getWritableDatabase(); // 以写方式打开数据库
		int result = 0; // 表示结果
		switch (uriMatcher.match(uri)) {
		case GET_MEMBER_LIST:
			result = db.update(DatabaseMetaData.MemberTableMetaData.TABLE_NAME,
					values, null, null);
			break;
		case GET_MEMBER_ITEM:
			long id = ContentUris.parseId(uri); // 找到里面的id
			String where = "_id=" + id;
			result = db.update(DatabaseMetaData.MemberTableMetaData.TABLE_NAME,
					values, where, selectionArgs);
			break;
		default:
			throw new UnsupportedOperationException("Not Support Operation:"
					+ uri);
		}
		return result;
	}

}

4、请求数据端的程序MyDemo.java 

package com.jackie.membercontentprovider;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class MyDemo extends Activity {
	private Button insertBut = null;
	private Button updateBut = null;
	private Button deleteBut = null;
	private Button queryBut = null;
	private TextView mainInfo = null;
	private ListView memberList = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.main);
		this.insertBut = (Button) super.findViewById(R.id.insertBut);
		this.updateBut = (Button) super.findViewById(R.id.updateBut);
		this.deleteBut = (Button) super.findViewById(R.id.deleteBut);
		this.queryBut = (Button) super.findViewById(R.id.queryBut);
		this.mainInfo = (TextView) super.findViewById(R.id.mainInfo);
		this.memberList = (ListView) super.findViewById(R.id.memberList);
		this.insertBut.setOnClickListener(new insertOnClickListener());
		this.updateBut.setOnClickListener(new updateOnClickListener());
		this.deleteBut.setOnClickListener(new deleteOnClickListener());
		this.queryBut.setOnClickListener(new queryOnClickListener());
	}

	public class insertOnClickListener implements OnClickListener {

		@Override
		public void onClick(View arg0) {
			MyDemo.this.mainInfo.setText("现在执行的是增加操作***");
			long id = 0;
			id = MyDemo.this.testInsert("孙悟空", 100, new SimpleDateFormat(
					"yyyy-mm-dd").format(new Date())); // 增加数据
			Toast.makeText(MyDemo.this, "数据增加成功,ID为:" + id, Toast.LENGTH_LONG)
					.show();
		}

	}

	public class updateOnClickListener implements OnClickListener {

		@Override
		public void onClick(View arg0) {
			MyDemo.this.mainInfo.setText("现在执行的是更新操作***");
			long result = 0;
			result = MyDemo.this.testUpdate("2", "sam", 34, "1987s-1-13"); // 更新数据
			Toast.makeText(MyDemo.this, "更新了" + result + "条记录",
					Toast.LENGTH_LONG).show();
		}

	}

	public class deleteOnClickListener implements OnClickListener {

		@Override
		public void onClick(View arg0) {
			MyDemo.this.mainInfo.setText("现在执行的是删除操作***");
			long result = 0;
			result = MyDemo.this.testDelete(String.valueOf(4)); // 更新数据
			Toast.makeText(MyDemo.this, "删除了" + result + "条记录",
					Toast.LENGTH_LONG).show();
		}

	}

	public class queryOnClickListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			MyDemo.this.mainInfo.setText("现在执行的是查询操作***");
			Cursor result = MyDemo.this.testQuery(null); // 查询全部
			MyDemo.this.startManagingCursor(result);     //把返回的结果交给系统管理
			List<Map<String, Object>> members = new ArrayList<Map<String, Object>>();
			for (result.moveToFirst(); !result.isAfterLast(); result
					.moveToNext()) {
				Map<String, Object> member = new HashMap<String, Object>();
				member.put("_id", result.getInt(0));
				member.put("name", result.getString(1));
				member.put("age", result.getInt(2));
				member.put("birthday", result.getString(3));
				members.add(member);
			}
			MyDemo.this.memberList.setAdapter(new SimpleAdapter(MyDemo.this,
					members, R.layout.member, new String[] { "_id", "name",
							"age", "birthday" }, new int[] { R.id._id,
							R.id.name, R.id.age, R.id.birthday }));
			Toast.makeText(MyDemo.this, "数据查询成功!!!",
					Toast.LENGTH_LONG).show();
		}

	}

	public long testInsert(String name, int age, String birthday) { // 执行增加数据操作
		ContentResolver contentresolver = super.getContentResolver();
		ContentValues values = new ContentValues();
		values.put(DatabaseMetaData.MemberTableMetaData.MEMBER_NAME, name);
		values.put(DatabaseMetaData.MemberTableMetaData.MEMBER_AGE, age);
		values.put(DatabaseMetaData.MemberTableMetaData.MEMBER_BIRTHDAY,
				birthday);
		Uri resultUri = contentresolver.insert(
				DatabaseMetaData.MemberTableMetaData.CONTENT_URI, values);
		System.out.println("***" + resultUri);
		return ContentUris.parseId(resultUri); // 解析出返回的id数据
	}

	public long testUpdate(String _id, String name, int age, String birthday) { // 执行增加数据操作
		long result = 0; // 返回结果
		ContentResolver contentresolver = super.getContentResolver();
		ContentValues values = new ContentValues();
		values.put(DatabaseMetaData.MemberTableMetaData.MEMBER_NAME, name);
		values.put(DatabaseMetaData.MemberTableMetaData.MEMBER_AGE, age);
		values.put(DatabaseMetaData.MemberTableMetaData.MEMBER_BIRTHDAY,
				birthday);

		if (_id == null || "".equals(_id)) { // 更新全部
			result = contentresolver.update(
					DatabaseMetaData.MemberTableMetaData.CONTENT_URI, values,
					null, null);
		} else {
			result = contentresolver.update(Uri.withAppendedPath(
					DatabaseMetaData.MemberTableMetaData.CONTENT_URI, _id),
					values, null, null);
		}
		return result; // 解析出返回的id数据
	}

	public long testDelete(String _id) { // 执行增加数据操作
		ContentResolver contentresolver = super.getContentResolver();
		long result = 0; // 返回结果
		if (_id == null || "".equals(_id)) { // 更新全部
			result = contentresolver.delete(
					DatabaseMetaData.MemberTableMetaData.CONTENT_URI, null,
					null);
		} else {
			result = contentresolver.delete(Uri.withAppendedPath(
					DatabaseMetaData.MemberTableMetaData.CONTENT_URI, _id),
					null, null);
		}
		return result; // 解析出返回的id数据
	}

	public Cursor testQuery(String _id) {
		ContentResolver contentresolver = super.getContentResolver();
		if (_id == null || "".equals(_id)) {
			return contentresolver
					.query(DatabaseMetaData.MemberTableMetaData.CONTENT_URI,
							null, null, null,
							DatabaseMetaData.MemberTableMetaData.SORT_ORDER);
		} else {
			return contentresolver.query(Uri.withAppendedPath(
					DatabaseMetaData.MemberTableMetaData.CONTENT_URI, _id),
					null, null, null,
					DatabaseMetaData.MemberTableMetaData.SORT_ORDER);
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.my_demo, menu);
		return true;
	}

}

5、查询到表的数据显示在终端,两布局文件main.xml和member.xml

Main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MyDemo" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        tools:context=".MyDemo" >

        <Button
            android:id="@+id/insertBut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="增加" />

        <Button
            android:id="@+id/updateBut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="更新" />

        <Button
            android:id="@+id/deleteBut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="删除" />

        <Button
            android:id="@+id/queryBut"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="查询" />
    </LinearLayout>

    <TextView
        android:id="@+id/mainInfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ListView
        android:id="@+id/memberList"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

member.xml
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MyDemo" >
    <TableRow>
        <TextView 
            android:id="@+id/_id"
            android:layout_width="30px"
            android:layout_height="wrap_content"/>
        <TextView 
            android:id="@+id/name"
            android:layout_width="100px"
            android:layout_height="wrap_content"/>
        <TextView 
            android:id="@+id/age"
            android:layout_width="60px"
            android:layout_height="wrap_content"/>
        <TextView 
            android:id="@+id/birthday"
            android:layout_width="200px"
            android:layout_height="wrap_content"/>
    </TableRow>
</TableLayout>





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现新闻界面可以采用 RecyclerView 控件来展示新闻列表,每个列表项包含新闻标题、摘要、发布时间等信息。可以使用 Retrofit 框架来请求服务器端的新闻数据,并使用 Gson 解析返回的 JSON 格式数据实现增删改查新闻可以采用 SQLite 数据库来存储新闻数据。可以在应用启动时创建数据库数据表,然后通过插入、删除、更新、查询等 SQL 操作实现增删改查功能。可以使用 ContentProvider 来封装数据库操作,以便在不同组件之间共享数据库数据。 具体实现步骤如下: 1. 在布局文件添加 RecyclerView 控件,并创建列表项布局文件。 2. 创建 News 类来存储新闻数据,包含标题、摘要、发布时间等字段。 3. 使用 Retrofit 框架创建接口来请求服务器端的新闻数据,并使用 Gson 解析返回的 JSON 格式数据。 4. 创建 NewsAdapter 类来绑定新闻数据和列表项布局,实现 RecyclerView.Adapter 接口的方法。 5. 实现新闻列表界面的点击事件,可以使用 Intent 传递新闻详情页面所需的数据。 6. 创建数据库数据表,包含新闻标题、内容、发布时间等字段。 7. 使用 ContentProvider 封装数据库操作,实现增删改查功能。 8. 在应用启动时初始化数据库,并在操作新闻数据时使用 ContentResolver 调用 ContentProvider 提供的方法。 9. 实现新闻详情界面,可以使用 WebView 控件展示新闻内容。 10. 实现添加、删除、更新新闻的操作界面,可以通过 AlertDialog 或者 BottomSheetDialog 等控件来展示。 以上是 Android Studio 实现新闻界面,并实现增删改查新闻的大致步骤,具体实现还需根据实际需求进行调整和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值