M.B*_*ett 7 android cursor android-contentprovider
我已经阅读了关于这个问题的所有内容,但没有通过这个问题.
我有一个简单的应用程序从开始MainActivity,我Content Provider的正确定义AndroidManifest.xml,ContentProvider该类似乎很好......这已经在运行4.3的运行版的ix50和运行4.2.1的华硕Memo Pad以及运行Jelly Bean的VDevices上进行了测试.应用程序在每个实例中运行并且不会崩溃,唯一LogCat能给我的是"Failed to find provider info for de.somename.provider"我的一个片段尝试查询Content Provider并获取游标.这里的代码:
AndroidManifest.xml中
<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)
<uses-sdk android:minSdkVersion="14"
android:targetSdkVersion="18" />
<application android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity android:name="de.somename.hvk3.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>
<activity android:name="de.somename.hvk3.UserSettingActivity"
android:label="@string/settings" ></activity>
<provider android:authorities="de.somename.provider"
android:enabled="true"
android:multiprocess="true"
android:name=".hvkContentProvider"
android:exported="true" ></provider>
</application>
Run Code Online (Sandbox Code Playgroud)
hvkContentProvider.java
public class hvkContentProvider extends ContentProvider {
private static final String DATABASE_NAME = "hvkDB";
private static final int DATABASE_VERSION = 1;
public static final String Authority = "de.somename.provider";
public static final String ElementPath = "/hv_kontakte";
public static final Uri CONTENT_URI = Uri.parse("content://" + Authority + ElementPath);
private static final int ALLROWS = 1;
private static final int SINGLE_ROW = 2;
private static final UriMatcher suriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static{
suriMatcher.addURI("de.somename.provider", ElementPath, ALLROWS);
suriMatcher.addURI("de.somename.provider", ElementPath + "/#", SINGLE_ROW);
}
public static final String KEY_ID = "_id";
public static final String KEY_TYPE = "type";
public static final String KEY_CLTYP = "cltyp";
public static final String KEY_MDT = "mdt";
public static final String KEY_OBJ = "obj";
public static final String KEY_VTR = "vtr";
public static final String KEY_FKZ = "fkz";
public static final String KEY_NAME = "name";
public static final String KEY_VNAME = "vname";
public static final String KEY_TEL = "tel";
public static final String KEY_FAX = "fax";
public static final String KEY_MOBIL = "mobil";
public static final String KEY_EMAIL = "email";
private MySQLiteOpenHelper myOpenHelper;
@Override
public boolean onCreate() {
myOpenHelper = new MySQLiteOpenHelper(getContext(), DATABASE_NAME, null, DATABASE_VERSION);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
String groupBy = null;
String having = null;
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(MySQLiteOpenHelper.DATABASE_TABLE);
switch(suriMatcher.match(uri)){
case SINGLE_ROW:
String rowID = uri.getPathSegments().get(1);
queryBuilder.appendWhere(KEY_ID + "=" + rowID);
default: break;
}
Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, groupBy, having, sortOrder);
return cursor;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
switch(suriMatcher.match(uri)){
case SINGLE_ROW:
String rowID = uri.getPathSegments().get(1);
selection = KEY_ID + "=" + rowID
+ (!TextUtils.isEmpty(selection) ?
" AND (" + selection + ')' : "");
default: break;
}
//To return the number of deleted items you must specify a where clause. To delete all rows and return a value pass in "1"
if (selection == null)
selection = "1";
return db.delete(MySQLiteOpenHelper.DATABASE_TABLE, selection, selectionArgs);
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
String nullColumnHack = null;
long id = db.insert(MySQLiteOpenHelper.DATABASE_TABLE, nullColumnHack, values);
if(id > -1){
Uri insertedId = ContentUris.withAppendedId(CONTENT_URI, id);
getContext().getContentResolver().notifyChange(insertedId, null);
return insertedId;
}
else
return null;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
switch(suriMatcher.match(uri)){
case SINGLE_ROW:
String rowID = uri.getPathSegments().get(1);
selection = KEY_ID + "=" + rowID
+ (!TextUtils.isEmpty(selection) ?
" AND (" + selection + ')' : "");
default: break;
}
return db.update(MySQLiteOpenHelper.DATABASE_TABLE, values, selection, selectionArgs);
}
@Override
public String getType(Uri uri) {
switch(suriMatcher.match(uri)){
case ALLROWS:
return "vnd.android.cursor.dir/vnd.somename.contacts";
case SINGLE_ROW:
return "vnd.android.cursor.item/vnd.somename.contacts";
default:
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
//Find the row ID and use it as a filename
String rowID = uri.getPathSegments().get(1);
//Create a file object in the applications external files directory
String picsDir = Environment.DIRECTORY_PICTURES;
File file = new File(getContext().getExternalFilesDir(picsDir), rowID);
if(!file.exists()) {
try{
file.createNewFile();
} catch (IOException e) {
//Log.d(TAG, "File creation failed: " + e.getMessage());
}
}
//Translate the mode parameter to the corresponding Parcel File Descriptor open mode
int fileMode = 0;
if(mode.contains("w"))
fileMode |= ParcelFileDescriptor.MODE_WRITE_ONLY;
if(mode.contains("r"))
fileMode |= ParcelFileDescriptor.MODE_READ_ONLY;
if(mode.contains("+"))
fileMode |= ParcelFileDescriptor.MODE_APPEND;
return ParcelFileDescriptor.open(file, fileMode);
}
private class MySQLiteOpenHelper extends SQLiteOpenHelper { //used to be static
public static final String DATABASE_TABLE = "hv_kontakte";
private static final String DATABASE_CREATE =
"CREATE TABLE " + DATABASE_TABLE + "(" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
KEY_TYPE + " TEXT, " + KEY_CLTYP + " TEXT, " + KEY_MDT + " INTEGER, " + KEY_OBJ + " INTEGER, "
+ KEY_VTR + " INTEGER, " + KEY_FKZ + " INTEGER, " + KEY_NAME + " TEXT, " + KEY_VNAME + " TEXT, "
+ KEY_TEL + " TEXT, " + KEY_FAX + " TEXT, " + KEY_MOBIL + " TEXT, " + KEY_EMAIL + " TEXT)";
public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database) {
database.execSQL(DATABASE_CREATE);
hvkContentProvider.this.insertSomeContacts();
}
@Override
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
database.execSQL("DROP TABLE IF EXISTS" + DATABASE_TABLE);
onCreate(database);
}
}
Run Code Online (Sandbox Code Playgroud)
}
HdwFragment.java
public class HdwFragment extends Fragment{
private SimpleCursorAdapter hdwDataAdapter;
private ListView listview;
public static final String ARG_SECTION_NUMBER = "section_number";
private static final String TAG = "HdwFragment";
public HdwFragment(){}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
Context context = getActivity();
View rootView = inflater.inflate(R.layout.fragment_all,container, false);
TextView dummyTextView = (TextView) rootView.findViewById(R.id.section_label);
dummyTextView.setText("Dienstleister");
//android.support.v4.app.LoaderManager loaderManager = getLoaderManager();
Log.i(TAG, "Before getContentResolver");
ContentResolver cr = context.getContentResolver();
Log.i(TAG, "Before result_columns");
String[] result_columns = new String[] {
hvkContentProvider.KEY_ID,
hvkContentProvider.KEY_TYPE,
hvkContentProvider.KEY_CLTYP,
hvkContentProvider.KEY_NAME,
hvkContentProvider.KEY_VNAME
};
Log.i(TAG, "Before where,whereArgs and order");
String where = null;
String whereArgs[] = null;
String order = null;
Log.i(TAG, "Before resultCursor action");
Log.i(TAG, "hvkContentProvider URI: " + hvkContentProvider.CONTENT_URI);
Cursor resultCursor = cr.query(hvkContentProvider.CONTENT_URI, result_columns, where, whereArgs, order);
Log.i(TAG, "resultCursor = " + resultCursor);
Log.i(TAG, "Before fromColumns");
String[] fromColumns = new String[]{
hvkContentProvider.KEY_TYPE,
hvkContentProvider.KEY_CLTYP,
hvkContentProvider.KEY_NAME,
hvkContentProvider.KEY_VNAME
};
Log.i(TAG, "Before toViews");
int[] toViews = new int[]{
R.id.contactType,
R.id.contactCltype,
R.id.contactName,
R.id.contactVname
};
Log.i(TAG, "Before Adapter");
hdwDataAdapter = new SimpleCursorAdapter(getActivity(), R.layout.object_list_item, resultCursor, fromColumns, toViews, 0);
listview = (ListView) rootView.findViewById(R.id.list_all);
listview.setAdapter(hdwDataAdapter);
Log.i(TAG, "Before return Layout");
return (LinearLayout) rootView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
//Bundle args = null;
//loaderManager.initLoader(LOADER_ID, args, loaderCallback);
}
Run Code Online (Sandbox Code Playgroud)
}
方法:insertSomeFunctions()我已经遗漏了,因为它在这里没有什么区别,会尽快给这个奖励.真的需要完成这件事.
Vik*_*ram 18
<provider android:authorities="de.somename.provider"
android:enabled="true"
android:multiprocess="true"
android:name=".hvkContentProvider"
android:exported="true" ></provider>
Run Code Online (Sandbox Code Playgroud)
从参考页面上<provider>:链接
android:authorities: ......为避免冲突,权限名称应使用Java样式的命名约定(例如com.example.provider.cartoonprovider).通常,它是实现提供程序的ContentProvider子类的名称.
在你的情况下,android:authorities应该有值:de.somename.provider.hvkContentProvider.
android:name: ......实现内容提供程序的类的名称,ContentProvider的子类.这应该是一个完全限定的类名(例如,"com.example.project.TransportationProvider").但是,作为简写,如果名称的第一个字符是句点,则将其附加到元素中指定的包名称.
所以,如果要定义package在manifest的标签AndroidManifest.xml,确认hvkContentProvider是在那个包.否则,android:name=".hvkContentProvider"改为android:name="de.somename.hvk3.hvkContentProvider"或your.package.name.hvkContentProvider
| 归档时间: |
|
| 查看次数: |
18431 次 |
| 最近记录: |