1
나는 동일한 질문을했지만 대답은 찾지 못했습니다. 여기 Android : UI Thread를 실행하는 동안 sqlite에 데이터를 삽입 할 수 있습니까?
내 메인 스레드에서 클래스 :private class DownloadTask extends AsyncTask<String, Void, String>
{
@Override
protected String doInBackground(String... urls)
{
// TODO Auto-generated method stub
XMLParser parser1 = new XMLParser();//System.out.println("XML before catching");
String result = parser1.getXmlFromUrl("http://exampl1.com/arrival.XML");
xml=result;
Document doc = parser1.getDomElement(xml);
NodeList nl = doc.getElementsByTagName(DOM_KEY_CONTENT);
arrayList = new ArrayList<HashMap<String,String>>();
databaseAirport myDbHelper ;
myDbHelper = new databaseAirport(ctx);
myDbHelper.open();
for (int i = 0; i < nl.getLength(); i++)
{
// creating new HashMap
HashMap<String, String> mapData= new HashMap<String, String>();
Element e = (Element) nl.item(i);
// adding each child node to HashMap key => value
mapData.put(DOM_KEY_ID, parser1.getValue(e, DOM_KEY_ID));
mapData.put(DOM_KEY_PRI_ID,parser1.getValue(e,DOM_KEY_PRI_ID));
mapData.put(DOM_KEY_FDATE, parser1.getValue(e, DOM_KEY_FDATE));
mapData.put(DOM_KEY_ORDER, parser1.getValue(e, DOM_KEY_ORDER));
arrayList.add(mapData);
, B1은, C1, D1은 VAR 글로벌 문자열 A1이며, 내가 다시 여기에 물어 싶은 이유
a1 = parser1.getValue(e, DOM_KEY_ID);
b1 = parser1.getValue(e, DOM_KEY_PRI_ID);
c1 = parser1.getValue(e, DOM_KEY_FDATE);
d1 = parser1.getValue(e, DOM_KEY_ORDER);
System.out.println(a1+b1+c1+d1);
myDbHelper.insertArrival(Integer.parseInt(a1), c1, Integer.parseInt(d1));
}
long size = arrayList.size();
System.out.println("Size of arrayList "+size);
return result;
}
}
A1, B1은 C1과 D1 정상
로 인쇄하고 여기에 오류가 있습니다 :
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
**Caused by: java.lang.NullPointerException**
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at com.airport.serverside.databaseAirport.open(databaseAirport.java:76)
at com.airport.serverside.AirportActivity$DownloadWebPageTask.doInBackground(AirportActivity.java:133)
at com.airport.serverside.AirportActivity$DownloadWebPageTask.doInBackground(AirportActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
편집
74 public databaseAirport open() throws SQLException
75 {
76 db = DBHelper.getWritableDatabase();
77 return this;
78 }
는 사람은 나 좀 도와 줄래 ? 미리 감사드립니다 ...
이렇게 오래간만에 붙어 있습니다. 당신은 생각 했나요? 그것은 주요 스레드가 데이터베이스로 접근 할 수 없기 때문입니까? –
아니요 데이터베이스가 쓰기 용으로 잠기고 여러 스레드에서 병렬로 액세스하기 때문입니다. 이 문제는 콘텐츠 제공 업체를 통해 해결 될 것이라고 확신 할 수 있습니다. –
hmmmm .... 데이터베이스로 접근하여 해결할 다른 방법이 없다면 시도해 보겠습니다. –