在学习LoadManager时遇到了奇怪的问题

coder_szc 2017-05-26 04:45:31
运行时报错如下:
05-26 00:20:56.571: E/AndroidRuntime(1334): FATAL EXCEPTION: AsyncTask #1
05-26 00:20:56.571: E/AndroidRuntime(1334): Process: com.example.studyofloadermanager, PID: 1334
05-26 00:20:56.571: E/AndroidRuntime(1334): java.lang.RuntimeException: An error occured while executing doInBackground()
05-26 00:20:56.571: E/AndroidRuntime(1334): at android.os.AsyncTask$3.done(AsyncTask.java:300)
05-26 00:20:56.571: E/AndroidRuntime(1334): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
05-26 00:20:56.571: E/AndroidRuntime(1334): at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
05-26 00:20:56.571: E/AndroidRuntime(1334): at java.util.concurrent.FutureTask.run(FutureTask.java:242)
05-26 00:20:56.571: E/AndroidRuntime(1334): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
05-26 00:20:56.571: E/AndroidRuntime(1334): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
E/AndroidRuntime(1334): at java.lang.Thread.run(Thread.java:841)
E/AndroidRuntime(1334): Caused by: java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
E/AndroidRuntime(1334): at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962)
E/AndroidRuntime(1334): at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:599)
E/AndroidRuntime(1334): at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)
E/AndroidRuntime(1334): at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)
E/AndroidRuntime(1334): at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834)
E/AndroidRuntime(1334): at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
E/AndroidRuntime(1334): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:144)
E/AndroidRuntime(1334): at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:133)
E/AndroidRuntime(1334): at android.content.ContentResolver.query(ContentResolver.java:480)
E/AndroidRuntime(1334): at android.content.CursorLoader.loadInBackground(CursorLoader.java:65)
E/AndroidRuntime(1334): at android.content.CursorLoader.loadInBackground(CursorLoader.java:43)
E/AndroidRuntime(1334): at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:312)
E/AndroidRuntime(1334): at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:69)
E/AndroidRuntime(1334): at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:57)
E/AndroidRuntime(1334): at android.os.AsyncTask$2.call(AsyncTask.java:288)
E/AndroidRuntime(1334): at java.util.concurrent.FutureTask.run(FutureTask.java:237)

数据库的创建类的代码

public class DatabaseCreater extends SQLiteOpenHelper {
private static String name = "person";
private static int version = 1;

public DatabaseCreater(Context context) {
super(context, name, null, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
String sql = "create table man(id int(4),name varchar(20),age int(3),sex varchar(5)," +
"constraint person_PK primary key(id));";
db.execSQL(sql);

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}

}



数据操作类的代码:

public class ServeProvider extends ContentProvider {
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
private static final int PERSON = 1;
private static final int PEOPLE = 2;
private DatabaseCreater dc;
private SQLiteDatabase sdb;
private String sql = "";
private StringBuffer sb = new StringBuffer();
private Set<String> keySet = new HashSet<String>();
private Iterator<String> ir = null;

static {
URI_MATCHER.addURI("com.example.studyofloadermanager.ServeProvider",
"person/#", PERSON);
URI_MATCHER.addURI("com.example.studyofloadermanager.ServeProvider",
"people",PEOPLE);
}

public ServeProvider() {
// TODO Auto-generated constructor stub
}

@Override
public boolean onCreate() {
// TODO Auto-generated method stub
dc = new DatabaseCreater(getContext());
return false;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
Cursor cursor = null;
@SuppressWarnings("unused")
String where = "";
sdb = dc.getReadableDatabase();
int flag = URI_MATCHER.match(uri);
switch(flag){
case PERSON:
long id = ContentUris.parseId(uri);
where = " id="+id+" ";
if(selection!=null && !selection.equals("")){
where += " and "+selection;
}
sql = "select * from person where "+where;

break;
case PEOPLE:
sql = "select * from person";
break;
}
cursor = sdb.rawQuery(sql, null);

sdb.close();
return cursor;
}

@Override
public String getType(Uri uri) {
// TODO Auto-generated method stub
String type = "";
int flag = URI_MATCHER.match(uri);
if(flag == PERSON){
type = "vnd.android.cursor.item/person";
}else{
type = "vnd.android.cursor.dir/people";
}
return type;
}

public void insert(String[] values){
int len = sb.length();
if(len>0){
sb.delete(0, len);
}
sql = "insert into person(id,name,age,sex) values(?,?,?,?);";

sdb = dc.getWritableDatabase();
sdb.execSQL(sql,values);

sdb.close();
}

@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
/*keySet = values.keySet();
ir = keySet.iterator();

int len = sb.length();
if(len>0){
sb.delete(0, len);
}

int i=0;
while(ir.hasNext()){
String key = ir.next();
String param = (String) values.get(key);
sb.append(param+",");
}

String[] params = sb.toString().split(",");
sql = "insert into person(id,name,age,sex) values(?,?,?,?);";

sdb = dc.getWritableDatabase();
sdb.execSQL(sql, params);

sdb.close();*/
return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
int flag = URI_MATCHER.match(uri);
String where = "";
sdb = dc.getWritableDatabase();

if(flag == PERSON){
long id = ContentUris.parseId(uri);
where = " id="+id+" ";
if(selection!=null && !selection.equals("")){
where += " and "+selection;
}
sql = "delete from person "+where;

}else{
/*
* 删除整张表的数据,慎用
*/
sql = "delete from person ";
}
sdb.execSQL(sql);

sdb.close();
return 0;
}

@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
int len = sb.length();
if(len>0){
sb.delete(0, len);
}

keySet = values.keySet();
ir = keySet.iterator();
while(ir.hasNext()){
String key = ir.next();
String value = values.getAsString(key);
sb.append(value+",");
}
String[] params = sb.toString().split(",");
sql = "update person set name=?,age=?,sex=? where id="+ContentUris.parseId(uri);
sdb = dc.getWritableDatabase();
sdb.execSQL(sql, params);

sdb.close();
return 0;
}

}



再就是主活动的代码了,我这儿略去onClick方法和onActivityResult方法,因为不会是它们俩引起的报错

public class MainActivity extends Activity implements OnClickListener{
private static final int requestCode = 1;
private ListView lv;
private Button b1,b2;
private LoaderManager lm;
private LoaderCallbacks<Cursor> lcbc;
private ArrayList<Map<String, String>> almss;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) this.findViewById(R.id.lv);
b1 = (Button) this.findViewById(R.id.b1);
b2 = (Button) this.findViewById(R.id.b2);
lcbc = new LoaderCallbacks<Cursor>() {

@Override
public void onLoaderReset(Loader<Cursor> loader) {
// TODO Auto-generated method stub

}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// TODO Auto-generated method stub
almss = new ArrayList<Map<String, String>>();

while(data.moveToNext()){
Map<String,String> mss = new HashMap<String,String>();
String mesg = "";
for(int i=0;i<data.getCount();i++){

String colName = data.getColumnName(i);
String colValue = data.getString(i);
mss.put(colName, colValue);

}
almss.add(mss);
}

lv.setAdapter(new SimpleAdapter(MainActivity.this, almss,
R.layout.activity_main, new String[] { "id", "name",
"age", "sex" }, new int[] { R.id.tv1,
R.id.tv2,R.id.tv3, R.id.tv4 }));

}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// TODO Auto-generated method stub
CursorLoader cl = new CursorLoader(MainActivity.this);
Uri uri = Uri
.parse("content://com.example.studyofloadermanager.ServeProvider/people");
cl.setUri(uri);
return cl;
}
};

lm = getLoaderManager();

lm.initLoader(100, null,lcbc);

b1.setOnClickListener(this);
b2.setOnClickListener(this);
}

...全文
347 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
r00_a2lBUR 2017-12-25
  • 打赏
  • 举报
回复
貌似楼主发完贴后就没有回来过。
r00_a2lBUR 2017-06-08
  • 打赏
  • 举报
回复
是在虚拟机上运行的吗?

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧