资讯详情

Android高级编程之自定义ContentProvider

将雪梨任务01 生词本作业中生成的生词本数据库本数据库ContentProvider与其他应用共享的方式。 要求如下: (1) 使用自定义SQLiteOpenHelper管理数据库; (2) 应列出提交操作数据的操作数据Uri以及数据表的字段名称; (3) 提交作业应自定义CP文件的核心代码。

package com.example.homework02contentprovider;  import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;  import androidx.annotation.Nullable;  public class WordDatabaseHelper extends SQLiteOpenHelper { 
            public WordDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) { 
                super(context, name, factory, version);     }      /** * 数据库不存在,第一次创建数据库时自动调用,只调用一次 * @param db */     @Override     public void onCreate(SQLiteDatabase db) { 
                db.execSQL("create table WordTB("   MyWord.MyStarTable._ID  " integer primary key autoincrement,"  MyWord.MyStarTable.WORD  " varchar(20) unique,"  MyWord.MyStarTable.MEAN  
      
       " varchar(200))"
       )
       ; 
       } 
       @Override 
       public 
       void 
       onUpgrade
       (
       SQLiteDatabase db
       , 
       int oldVersion
       , 
       int newVersion
       ) 
       { 
         
       } 
       } 
      

package com.example.homework02contentprovider;

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

/** * 用预定义数据表的结构的Java Bean */
public class MyWord { 
       
    //定义Authority
    public static final String AUTHORITY = "net.onest.lrf.provider";
    //定义内部表结构(列名)
    public static final class MyStarTable implements BaseColumns { 
       
        //定义数据表的列名称
        public final static String _ID = "id";
        public final static String WORD = "word";
        public final static String MEAN = "mean";

        //定义两个Uri
        public final static Uri WORDS_CONTENT_URI =
                Uri.parse("content://" + AUTHORITY + "/words");
        public final static Uri WORD_CONTENT_URI =
                Uri.parse("content://"+AUTHORITY+"/word/#");//#可以代表任意的数字
    }
}

content://net.onest.lrf.provider/words content://net.onest.lrf.provider/word/#

id integer primary key autoincrement, word varchar(20) unique, mean varchar(200)

package com.example.homework02contentprovider;

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 WordContentProvider extends ContentProvider { 
       

    //定义两个标号
    private static final int WORDS = 1;
    private static final int WORD = 2;
    //定义数据库管理类的对象属性
    private WordDatabaseHelper dbHelper;
    //定义UriMatcher属性
    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    //注册两个Uri并关联Uri与标号
    static { 
       
        matcher.addURI(MyWord.AUTHORITY,"/words",WORDS);
        matcher.addURI(MyWord.AUTHORITY,"/word/#",WORD);
    }

    public WordContentProvider() { 
       
    }

    /** * 删除数据 * @param uri * @param selection * @param selectionArgs * @return */
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) { 
       
        //获取可写的数据库对象
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int n = 0;
        switch (matcher.match(uri)){ 
       
            case WORDS:
                n = db.delete("WordTB",selection,selectionArgs);
                break;
            case WORD:
                long id = ContentUris.parseId(uri);
                //重新拼接where条件
                String where = "id=" + id;
                if(null != selection && !selection.equals("")){ 
       
                    where = "id = " + id + " and " + selection;
                }
                //执行数据库删除的操作
                n = db.delete("WordTB",where,selectionArgs);
                break;
            default:
                throw new UnsupportedOperationException("Not yet implemented");
        }
        return n;
    }
    
    @Override
    public String getType(Uri uri) { 
       
        String type = null;
        //根据参数的形式(批量/单一 操作)来返回相应的MIME类型
        switch (matcher.match(uri)){ 
       
            case WORDS://表示批量操作数据
                type = "lrf.cursor.dir/net.onest.lrf.provider";
                break;
            case WORD://表示单一数据操作
                type = "lrf.cursor.item/net.onest.lrf.provider";
                break;
            default:
                throw new UnsupportedOperationException("Not yet implemented");
        }
        return type;
    }

    /** * 插入数据 * @param uri * @param values * @return */
    @Override
    public Uri insert(Uri uri, ContentValues values) { 
       
        //实现数据的插入操作
        switch (matcher.match(uri)){ 
       
            case WORD:
                //获取可写的数据库对象
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                //执行插入操作
                long rowId = db.insert("WordTB",null,values);
                if(rowId > 0){ 
       
                    //插入成功
                    //拼接Uri和被插入的数据的id
                    return ContentUris.withAppendedId(uri,rowId);
                }else{ 
       
                    //插入失败
                    return null;
                }
            default:
                throw new UnsupportedOperationException("Not yet implemented");
        }
    }

    @Override
    public boolean onCreate() { 
       
        dbHelper = new WordDatabaseHelper(getContext(),"WordsDB.db",null,1);
        return true;
    }

    /** * 查询数据 * @param uri * @param projection * @param selection * @param selectionArgs * @param sortOrder * @return */
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) { 
       
        //获取可读的数据库对象
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = null;
        switch (matcher.match(uri)){ 
       
            case WORDS://批量查询操作
                cursor = db.query("WordTB",projection,selection,selectionArgs,null,null,sortOrder);
                break;
            case WORD://单一查询操作
                //解析Uri中的id
                long id = ContentUris.parseId(uri);
                //重新拼接where条件
                String where = "id=" + id + " and " + selection;
                //获取数据库执行查询操作
                cursor = db.query("WordTB",projection,where,selectionArgs,null,null,sortOrder);
                break;
            default:
                throw new UnsupportedOperationException("Not yet implemented");
        }
        return cursor;
    }

    /** * 数据更新/数据修改 * @param uri * @param values * @param selection * @param selectionArgs * @return */
    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) { 
       
        //获取可写的数据库对象
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        int n = 0;
        switch (matcher.match(uri)){ 
       
            case WORDS:
                n = db.update("WordTB",values,selection,selectionArgs);
                break;
            case WORD:
                //解析Uri中的id
                long id = ContentUris.parseId(uri);
                //重新拼接where条件
                String where = "id=" + id;
                if(selection != null && !selection.equals("")){ 
       
                    where = "id=" + id + " and " + selection;
                }
                //执行数据库更新操作
                n = db.update("WordTB",values,where,selectionArgs);
                break;
            default:
                throw new UnsupportedOperationException("Not yet implemented");
        }
        return n;
    }
}

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

    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
        <provider android:name=".WordContentProvider" android:authorities="net.onest.lrf.provider" android:enabled="true" android:exported="true"></provider>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

标签: 三极管lrf2807

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台