Android:从第二个活动刷新游标加载程序
祝你今天愉快。我正在学习Android开发,所以我正在创建一个简单的CRUD应用程序,现在我的主要活动是listview(MarcaActivity),下面是代码:Android:从第二个活动刷新游标加载程序,android,listview,android-activity,android-cursorloader,Android,Listview,Android Activity,Android Cursorloader,祝你今天愉快。我正在学习Android开发,所以我正在创建一个简单的CRUD应用程序,现在我的主要活动是listview(MarcaActivity),下面是代码: package com.example.crudapp.activity; import android.app.Activity; import android.app.LoaderManager; import android.content.CursorLoader; import android.content.Inten
package com.example.crudapp.activity;
import android.app.Activity;
import android.app.LoaderManager;
import android.content.CursorLoader;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import com.example.crudapp.MarcaCursorAdapter;
import com.example.crudapp.R;
import com.example.crudapp.cp.MarcaCP;
public class MarcaActivity extends Activity implements
LoaderManager.LoaderCallbacks<Cursor> {
MarcaCursorAdapter crsAdap;
ListView lstMarcas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_marca);
lstMarcas = (ListView)findViewById(R.id.lstMarcas);
lstMarcas.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
Intent i = new Intent(MarcaActivity.this, MarcaDetailActivity.class);
Uri todoUri = Uri.parse(MarcaCP.CONTENT_URI + "/" + arg3);
i.putExtra("DET", todoUri);
i.putExtra("ACTION", "EXISTING");
startActivity(i);
}
});
getLoaderManager().initLoader(0, null, this);
fillData();
}
protected void onRestoreInstanceState(Bundle savedInstanceState) {
getLoaderManager().restartLoader(0, null, this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.insertMnu:
Intent i = new Intent(this, MarcaDetailActivity.class);
i.putExtra("ACTION", "NEW");
startActivityForResult(i, 0);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
/*switch (item.) {
case DELETE_ID:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
Uri uri = Uri.parse(MarcaCP.CONTENT_URI + "/"
+ info.id);
getContentResolver().delete(uri, null, null);
fillData();
return true;
}*/
return super.onContextItemSelected(item);
}
private void fillData() {
crsAdap = new MarcaCursorAdapter(this, R.layout.template_marcas, null ,
new String[]{MarcaCP.Marca.NOMBRE, MarcaCP.Marca.RANKING}, new int[]{R.id.nomMarca, R.id.rankMarca});
lstMarcas.setAdapter(crsAdap);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.marca, menu);
return true;
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
return new CursorLoader(this, MarcaCP.CONTENT_URI,
new String[]{MarcaCP.Marca.ID, MarcaCP.Marca.NOMBRE, MarcaCP.Marca.CODIGO, MarcaCP.Marca.RANKING}, null, null, null);
}
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
crsAdap.swapCursor(arg1);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
crsAdap.swapCursor(null);
} }
但在所有示例中,我发现所有内容(在数据库中插入数据并刷新列表)都在同一个活动中,但在本例中,我有一个带有列表的活动和第二个插入项目的活动,因此我认为我必须从我的详细活动调用restartLoader,但我不知道怎么做,也不知道这样做是否正确。当我创建调用细节活动的意图,并有一个调用restartLoader的公共方法时,我正在考虑将对列表活动的引用保存在extras中,但我不知道这是否是最好的方法。从“我的详细信息”活动中刷新光标加载程序的最佳方法是什么
还有我的内容提供商MarcaCP:
package com.example.crudapp.cp;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import com.example.crudapp.util.ConnHandler;
public class MarcaCP extends ContentProvider {
private static final int TODOS = 10;
private static final int TODO_ID = 20;
public static final Uri CONTENT_URI = Uri.parse("content://provider.marcacp/marcas");
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI("provider.marcacp", "marcas", TODOS);
sURIMatcher.addURI("provider.marcacp", "marcas" + "/#", TODO_ID);
}
public static class Marca {
public static final String TABLA = "MARCA";
public static final String ID = "_id";
public static final String CODIGO = "codigo";
public static final String NOMBRE = "nombre";
public static final String CLASIFICACION = "clasificacion";
public static final String RANKING = "ranking";
}
private ConnHandler conn;
SQLiteDatabase dbObj;
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int uriType = sURIMatcher.match(uri);
int rowsDeleted = 0;
switch (uriType) {
case TODOS:
rowsDeleted = dbObj.delete(Marca.TABLA, selection, selectionArgs);
break;
case TODO_ID:
String id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection)) {
rowsDeleted = dbObj.delete(Marca.TABLA,
Marca.ID + " = " + id,
null);
} else {
rowsDeleted = dbObj.delete(Marca.TABLA,
Marca.ID + " =" + id
+ " and " + selection,
selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsDeleted;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int uriType = sURIMatcher.match(uri);
long id = 0;
switch (uriType) {
case TODOS:
id = dbObj.insert(Marca.TABLA, null, values);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse("marca/" + id);
}
@Override
public boolean onCreate() {
conn = new ConnHandler(getContext());
dbObj = conn.getDb();
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// Uisng SQLiteQueryBuilder instead of query() method
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
checkColumns(projection);
queryBuilder.setTables(Marca.TABLA);
int uriType = sURIMatcher.match(uri);
switch (uriType) {
case TODOS:
break;
case TODO_ID:
// Digamos para ver el detalle de un registro
queryBuilder.appendWhere(Marca.ID + " = "
+ uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Unknown URIx: " + uri);
}
Cursor cur = queryBuilder.query(dbObj, projection, selection,
selectionArgs, null, null, sortOrder);
return cur;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int uriType = sURIMatcher.match(uri);
int rowsUpdated = 0;
switch (uriType) {
case TODOS:
rowsUpdated = dbObj.update(Marca.TABLA,
values,
selection,
selectionArgs);
break;
case TODO_ID:
String id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection)) {
rowsUpdated = dbObj.update(Marca.TABLA,
values,
Marca.ID + " =" + id,
null);
} else {
rowsUpdated = dbObj.update(Marca.TABLA,
values,
Marca.ID + " =" + id
+ " and "
+ selection,
selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsUpdated;
}
private void checkColumns(String[] projection) {
/*String[] available = { TodoTable.COLUMN_CATEGORY,
TodoTable.COLUMN_SUMMARY, TodoTable.COLUMN_DESCRIPTION,
TodoTable.COLUMN_ID };
if (projection != null) {
HashSet<String> requestedColumns = new HashSet<String>(Arrays.asList(projection));
HashSet<String> availableColumns = new HashSet<String>(Arrays.asList(available));
// Check if all columns which are requested are available
if (!availableColumns.containsAll(requestedColumns)) {
throw new IllegalArgumentException("Unknown columns in projection");
}
}*/
} }
package com.example.crudapp.cp;
导入android.content.ContentProvider;
导入android.content.ContentValues;
导入android.content.UriMatcher;
导入android.database.Cursor;
导入android.database.sqlite.SQLiteDatabase;
导入android.database.sqlite.SQLiteQueryBuilder;
导入android.net.Uri;
导入android.text.TextUtils;
导入com.example.crudapp.util.ConnHandler;
公共类MarcaCP扩展了ContentProvider{
专用静态最终int TODOS=10;
私有静态最终int TODO_ID=20;
公共静态最终Uri内容\u Uri=Uri.parse(“content://provider.marcacp/marcas");
私有静态最终UriMatcher sURIMatcher=新UriMatcher(UriMatcher.NO_匹配);
静止的{
addURI(“provider.marcacp”、“marcas”、“TODOS”);
addURI(“provider.marcacp”,“marcas”+“/#”,TODO_ID);
}
公共静态类Marca{
公共静态最终字符串TABLA=“MARCA”;
公共静态最终字符串ID=“\u ID”;
公共静态最终字符串CODIGO=“CODIGO”;
公共静态最终字符串NOMBRE=“NOMBRE”;
公共静态最终字符串CLASIFICACION=“CLASIFICACION”;
公共静态最终字符串RANKING=“RANKING”;
}
私人康涅狄格州;
sqlitedbobj数据库;
@凌驾
public int delete(Uri、字符串选择、字符串[]selectionArgs){
int-uriType=sURIMatcher.match(uri);
int rowsDeleted=0;
开关(URI型){
待办事项:
rowsDeleted=dbObj.delete(Marca.TABLA,selection,selectionArgs);
打破
待办案件编号:
String id=uri.getLastPathSegment();
if(TextUtils.isEmpty(选择)){
rowsDeleted=dbObj.delete(Marca.TABLA,
Marca.ID+“=”+ID,
无效);
}否则{
rowsDeleted=dbObj.delete(Marca.TABLA,
Marca.ID+“=”+ID
+"及"选择,,
选择;
}
打破
违约:
抛出新的IllegalArgumentException(“未知URI:+URI”);
}
getContext().getContentResolver().notifyChange(uri,null);
返回删除的行;
}
@凌驾
公共字符串getType(Uri){
//TODO自动生成的方法存根
返回null;
}
@凌驾
公共Uri插入(Uri、ContentValues){
int-uriType=sURIMatcher.match(uri);
长id=0;
开关(URI型){
待办事项:
id=dbObj.insert(Marca.TABLA,null,value);
打破
违约:
抛出新的IllegalArgumentException(“未知URI:+URI”);
}
getContext().getContentResolver().notifyChange(uri,null);
返回Uri.parse(“marca/”+id);
}
@凌驾
公共布尔onCreate(){
conn=新的ConnHandler(getContext());
dbObj=conn.getDb();
返回true;
}
@凌驾
公共游标查询(Uri、字符串[]投影、字符串选择、,
字符串[]selectionArgs,字符串排序器){
//使用SQLiteQueryBuilder代替query()方法
SQLiteQueryBuilder queryBuilder=newsqlitequerybuilder();
检查列(投影);
queryBuilder.setTables(Marca.TABLA);
int-uriType=sURIMatcher.match(uri);
开关(URI型){
待办事项:
打破
待办案件编号:
//登记册上的数字图书馆
queryBuilder.appendWhere(Marca.ID+“=”
+getLastPathSegment());
打破
违约:
抛出新的IllegalArgumentException(“未知URIx:+uri”);
}
Cursor cur=queryBuilder.query(dbObj、投影、选择、,
selectionArgs、null、null、sortOrder);
返回电流;
}
@凌驾
公共int更新(Uri、ContentValues、字符串选择、,
字符串[]selectionArgs){
int-uriType=sURIMatcher.match(uri);
int rowsUpdated=0;
开关(URI型){
待办事项:
rowsUpdated=dbObj.update(Marca.TABLA,
价值观
选择,
选择;
打破
待办案件编号:
String id=uri.getLastPathSegment();
if(TextUtils.isEmpty(选择)){
rowsUpdated=dbObj.update(Marca.TABLA,
价值观
Marca.ID+“=”+ID,
无效);
}否则{
rowsUpdated=dbObj.update(Marca.TABLA,
价值观
Marca.ID+“=”+ID
+“和”
+选择,
选择;
}
打破
违约:
抛出新的IllegalArgumentException(“未知URI:+URI”);
}
getContext().getContentResolver().notifyChange(uri,null);
返回原始数据;
}
私有void检查列(字符串[]投影){
/*String[]available={TodoTable.COLUMN_CATEGORY,
TodoTable.COLUMN\u摘要,TodoTable.COLUMN\u说明,
TodoTable.COLUMN_ID};
if(投影!=null){
HashSet requestedColumns=新的HashSet(Arrays.asList(projection));
HashSet availableColumns=新的HashSet(Arrays.asList(available));
//检查请求的所有列是否都可用
如果(!availableColumns.containsAll(requestedColumns)){
抛出新的IllegalArgumentException(“投影中的未知列”);
getLoaderManager().restartLoader(LIST_ID, null, this);
package com.example.crudapp.cp;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.text.TextUtils;
import com.example.crudapp.util.ConnHandler;
public class MarcaCP extends ContentProvider {
private static final int TODOS = 10;
private static final int TODO_ID = 20;
public static final Uri CONTENT_URI = Uri.parse("content://provider.marcacp/marcas");
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI("provider.marcacp", "marcas", TODOS);
sURIMatcher.addURI("provider.marcacp", "marcas" + "/#", TODO_ID);
}
public static class Marca {
public static final String TABLA = "MARCA";
public static final String ID = "_id";
public static final String CODIGO = "codigo";
public static final String NOMBRE = "nombre";
public static final String CLASIFICACION = "clasificacion";
public static final String RANKING = "ranking";
}
private ConnHandler conn;
SQLiteDatabase dbObj;
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int uriType = sURIMatcher.match(uri);
int rowsDeleted = 0;
switch (uriType) {
case TODOS:
rowsDeleted = dbObj.delete(Marca.TABLA, selection, selectionArgs);
break;
case TODO_ID:
String id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection)) {
rowsDeleted = dbObj.delete(Marca.TABLA,
Marca.ID + " = " + id,
null);
} else {
rowsDeleted = dbObj.delete(Marca.TABLA,
Marca.ID + " =" + id
+ " and " + selection,
selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsDeleted;
}
@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int uriType = sURIMatcher.match(uri);
long id = 0;
switch (uriType) {
case TODOS:
id = dbObj.insert(Marca.TABLA, null, values);
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return Uri.parse("marca/" + id);
}
@Override
public boolean onCreate() {
conn = new ConnHandler(getContext());
dbObj = conn.getDb();
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// Uisng SQLiteQueryBuilder instead of query() method
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
checkColumns(projection);
queryBuilder.setTables(Marca.TABLA);
int uriType = sURIMatcher.match(uri);
switch (uriType) {
case TODOS:
break;
case TODO_ID:
// Digamos para ver el detalle de un registro
queryBuilder.appendWhere(Marca.ID + " = "
+ uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Unknown URIx: " + uri);
}
Cursor cur = queryBuilder.query(dbObj, projection, selection,
selectionArgs, null, null, sortOrder);
return cur;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int uriType = sURIMatcher.match(uri);
int rowsUpdated = 0;
switch (uriType) {
case TODOS:
rowsUpdated = dbObj.update(Marca.TABLA,
values,
selection,
selectionArgs);
break;
case TODO_ID:
String id = uri.getLastPathSegment();
if (TextUtils.isEmpty(selection)) {
rowsUpdated = dbObj.update(Marca.TABLA,
values,
Marca.ID + " =" + id,
null);
} else {
rowsUpdated = dbObj.update(Marca.TABLA,
values,
Marca.ID + " =" + id
+ " and "
+ selection,
selectionArgs);
}
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
getContext().getContentResolver().notifyChange(uri, null);
return rowsUpdated;
}
private void checkColumns(String[] projection) {
/*String[] available = { TodoTable.COLUMN_CATEGORY,
TodoTable.COLUMN_SUMMARY, TodoTable.COLUMN_DESCRIPTION,
TodoTable.COLUMN_ID };
if (projection != null) {
HashSet<String> requestedColumns = new HashSet<String>(Arrays.asList(projection));
HashSet<String> availableColumns = new HashSet<String>(Arrays.asList(available));
// Check if all columns which are requested are available
if (!availableColumns.containsAll(requestedColumns)) {
throw new IllegalArgumentException("Unknown columns in projection");
}
}*/
} }
<provider android:name=".cp.MarcaCP" android:authorities="provider.marcacp" />