0

私のアプリはサーバーからデータをロードし、デバイス android のデータベース sqlite に保存します。私の問題は、データベース内のデータの複製をテストしたいときです -> 私のアプリエラー。助けていただけますか!コード CLASS DB_Adapter クエリの位置 " * " でデータベースにエラーが発生しました

public class DB_Adapter {
public static final String INVOICEID = "invoiceid";
public static final String NUMBERPHONE = "numberphone";
public static final String ADDRESS = "address";
public static final String NUMBER = "number";
public static final String SNAME = "name";
public static final String URL = "url";
public static final String STATUS = "status";

public static final String DB_NAME = "CSDL";
public static final String DB_TABLE = "Saigonfleamarket";
public static final int DB_VERSION = 2;

private final Context mContext;
private SQLiteDatabase mDB;
private DBHelper mDBHelper;

public DB_Adapter(Context c) {
    mContext = c;
}

private static class DBHelper extends SQLiteOpenHelper
{

    public DBHelper(Context context, String name, CursorFactory factory,
            int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        try
        {
            db.execSQL("CREATE TABLE Saigonfleamarket (number integer PRIMARY KEY autoincrement, invoiceid text,name text, numberphone text, address text,url text, status text);");
        } catch (SQLException ex)
        {
            ex.printStackTrace();
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        Log.i("DBAdapter", "Updating database...");
        db.execSQL("DROP TABLE IF EXISTS Saigonfleamarket");
        onCreate(db);
    }
}

public DB_Adapter openDB()
{
    mDBHelper = new DBHelper(mContext, DB_NAME, null, DB_VERSION);
    mDB = mDBHelper.getWritableDatabase();
    return this;
}

public void closeDB()
{
    mDBHelper.close();
}

public long insert(String _invoiceid, String _name, String _numberphone, String _address,
        String _url, String _status)
{
    ContentValues cv = new ContentValues();
    cv.put(INVOICEID, _invoiceid);
    cv.put(SNAME, _name);
    cv.put(NUMBERPHONE, _numberphone);
    cv.put(ADDRESS, _address);
    cv.put(URL, _url);
    cv.put(STATUS, _status);
    return mDB.insert(DB_TABLE, null, cv);
}

public boolean remove(int _number)
{
    return mDB.delete(DB_TABLE, INVOICEID + "=" + _number, null) > 0;
}

public Cursor getAllStudent()
{
    return mDB.query(DB_TABLE, new String[] {
            NUMBER, INVOICEID, SNAME, NUMBERPHONE, ADDRESS, URL, STATUS
    }, null, null, null, null, null);
}

public Cursor getStudentById(int _number)
{
    Cursor mCursor = mDB.query(true, DB_TABLE, new String[] {
            NUMBER, INVOICEID, SNAME, NUMBERPHONE, ADDRESS, URL, STATUS
    }, NUMBER + "=" + _number, null, null, null, null, null);
    if (mCursor != null)
    {
        mCursor.moveToFirst();
    }

    return mCursor;
}

***public Boolean test (String mahoadon)***
{
    Boolean flag=true;
    Cursor mCursor = mDB.query(true, DB_TABLE, new String[] {
            NUMBER, INVOICEID, SNAME, NUMBERPHONE, ADDRESS, URL, STATUS
    }, INVOICEID + "=" + mahoadon, null, null, null, null, null);
    if (mCursor != null)
    {
        flag=false;
    }
    else
    {
        flag=true;
    }

    return flag;
}

}

クラスのデータの読み込みとデータベースへの保存

private DB_Adapter mDb = new DB_Adapter(this); 
// class load data từ server về thiết bị
private class LoadData extends AsyncTask<Void, Void, Void> {
    private ProgressDialog progressDialog;
    private Boolean flag = false;
    String phonenumber;
    String name;
    String address;
    String url;
    String code;
    private JSONArray jArray;
    private String result = null;
    private InputStream is = null;
    private StringBuilder sb = null;
    private ArrayList<String> phonenumberArray = new ArrayList<String>();
    private ArrayList<String> codeInvoiceArray = new ArrayList<String>();
    private ArrayList<String> nameArray = new ArrayList<String>();
    private ArrayList<String> addressArray = new ArrayList<String>();
    private ArrayList<String> urlArray = new ArrayList<String>();
    private ListView listview;


    @Override
    // can use UI thread here
    protected void onPreExecute() {
        this.progressDialog = ProgressDialog.show(Hoadon.this, "",
                " Đang tải thông tin...");
    }

    // hiển thị thông tin lên listview của Activity
    @Override
    protected void onPostExecute(final Void unused) {
        this.progressDialog.dismiss();
        if (flag == true)
        {

            thongbao("Tải dữ liệu thành công");
        }
        else
        {
            thongbao("Hôm nay không có gì để giao!");
        }
        try {
            listview = (ListView) findViewById(R.id.listView1);
            this.progressDialog.dismiss();
            listview.setAdapter(new DataAdapter(Hoadon.this, codeInvoiceArray
                    .toArray(new String[codeInvoiceArray.size()]), nameArray
                    .toArray(new String[nameArray.size()]),phonenumberArray
                    .toArray(new String[phonenumberArray.size()]), addressArray
                    .toArray(new String[addressArray.size()])));
            listview.setOnItemClickListener(new OnItemClickListener() {

                //xử lý sự kiện khi chọn item trên listview
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                        int position, long id) {
                    Intent j=new Intent(Hoadon.this,Menu_Main.class);

                    //lấy thông tin thông qua vị trí của item được chọn
                    String url = urlArray.get(position);
                    String address = addressArray.get(position);
                    String mahoadon = codeInvoiceArray.get(position);
                    String phone=phonenumberArray.get(position);

                    //chuyển thông tin này qua bên phần ký tên
                    j.putExtra("url", url);
                    j.putExtra("address", address);
                    j.putExtra("mahoadon", mahoadon);
                    j.putExtra("phone",phone);
                    j.putExtra("ID", IDinvoice);
                    startActivity(j);
                }
            });
        } catch (Exception e) {

            Toast.makeText(getApplicationContext(), e.toString(),
                    Toast.LENGTH_LONG).show();
        }
    }

    // lấy thông tin từ server về dưới dạng json, được chuyển thành chuỗi và
    // lưu vào các mảng
    @Override
    protected Void doInBackground(Void... params) {
        try {
            /*Calendar cal = Calendar.getInstance();
            int date1 = cal.get(Calendar.DAY_OF_MONTH);
            int month = cal.get(Calendar.MONTH) + 1;
            int year = cal.get(Calendar.YEAR);
            String str1 = date1 + "/" + month + "/" + year;*/

            //Gửi thông tin id người giao hàng lên server để lấy danh sách hóa đơn về
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(
                    "http://longvansolution.tk/monthlytarget.php");
            nameValuePairs = new ArrayList<NameValuePair>(1);
            nameValuePairs.add(new BasicNameValuePair("user", IDinvoice));
            /*nameValuePairs.add(new BasicNameValuePair("mydate", str1));*/
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();

            //chuyển thông tin nhận được về dạng chuỗi
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(is, "iso-8859-1"), 80);
            sb = new StringBuilder();
            sb.append(reader.readLine() + "\n");
            String line = "0";
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            result = sb.toString();
        } catch (Exception e) {
            Toast.makeText(getApplicationContext(), e.toString(),
                    Toast.LENGTH_LONG).show();
        }

        //kiểm tra thông tin nhận được từ server 
        if (result.equalsIgnoreCase("null\n\n \n"))
        {
            flag = false;

            //làm sạch mảng trước khi muốn thêm các thành phần để tránh tình trạng trùng lặp
            phonenumberArray.clear();
            codeInvoiceArray.clear();
            nameArray.clear();
            addressArray.clear();
            urlArray.clear();
        } else
        {
            flag = true;
            try {
                jArray = new JSONArray(result);
                JSONObject json_data = null;
                phonenumberArray.clear();
                codeInvoiceArray.clear();
                nameArray.clear();
                addressArray.clear();
                urlArray.clear();
                mDb.openDB();

                //sử dụng json lấy các giá trị thông qua các key
                //gán nó vào các mảng tương ứng
                for (int i = 0; i < jArray.length(); i++) {
                    json_data = jArray.getJSONObject(i);
                    phonenumber = json_data.getString("phonenumber");
                    address = json_data.getString("address");
                    name = json_data.getString("name");
                    url = json_data.getString("url");
                    code = json_data.getString("code");
                    phonenumberArray.add(phonenumber);
                    codeInvoiceArray.add(code);
                    nameArray.add(name);
                    addressArray.add(address);
                    urlArray.add(url);
                    ***if(mDb.test(code)==true)
                    {
                        mDb.insert(code, name, phonenumber, address, url, "Chuagiao");
                    }***
                }
            } catch (JSONException e) {
                Toast.makeText(getApplicationContext(), e.toString(),
                        Toast.LENGTH_LONG).show();

            } catch (ParseException e) {
                Toast.makeText(getApplicationContext(), e.toString(),
                        Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), e.toString(),
                        Toast.LENGTH_LONG).show();
            }
        }
        mDb.closeDB();
        return null;
    }
}

ログエラー

12-12 11:08:31.979: W/dalvikvm(1384): threadid=14: thread exiting with uncaught    exception (group=0x40015560)
12-12 11:08:31.987: E/AndroidRuntime(1384): FATAL EXCEPTION: AsyncTask #4
12-12 11:08:31.987: E/AndroidRuntime(1384): java.lang.RuntimeException: An error occured while executing doInBackground()
12-12 11:08:31.987: E/AndroidRuntime(1384):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at java.lang.Thread.run(Thread.java:1019)
12-12 11:08:31.987: E/AndroidRuntime(1384): Caused by: java.lang.RuntimeException: Can't  create handler inside thread that has not called Looper.prepare()
12-12 11:08:31.987: E/AndroidRuntime(1384):     at android.os.Handler.<init>(Handler.java:121)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at android.widget.Toast.<init>(Toast.java:68)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at android.widget.Toast.makeText(Toast.java:231)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at com.example.finishdemo.Hoadon$LoadData.doInBackground(Hoadon.java:437)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at com.example.finishdemo.Hoadon$LoadData.doInBackground(Hoadon.java:1)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
12-12 11:08:31.987: E/AndroidRuntime(1384):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
12-12 11:08:31.987: E/AndroidRuntime(1384):     ... 4 more
12-12 11:08:33.347: E/WindowManager(1384): Activity com.example.finishdemo.Hoadon has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405aa248 that was originally added here
12-12 11:08:33.347: E/WindowManager(1384): android.view.WindowLeaked: Activity com.example.finishdemo.Hoadon has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@405aa248 that was originally added here
12-12 11:08:33.347: E/WindowManager(1384):  at android.view.ViewRoot.<init>(ViewRoot.java:258)
12-12 11:08:33.347: E/WindowManager(1384):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
12-12 11:08:33.347: E/WindowManager(1384):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
12-12 11:08:33.347: E/WindowManager(1384):  at android.view.Window$LocalWindowManager.addView(Window.java:424)
12-12 11:08:33.347: E/WindowManager(1384):  at android.app.Dialog.show(Dialog.java:241)
12-12 11:08:33.347: E/WindowManager(1384):  at   android.app.ProgressDialog.show(ProgressDialog.java:107)
12-12 11:08:33.347: E/WindowManager(1384):  at android.app.ProgressDialog.show(ProgressDialog.java:90)
12-12 11:08:33.347: E/WindowManager(1384):  at android.app.ProgressDialog.show(ProgressDialog.java:85)
12-12 11:08:33.347: E/WindowManager(1384):  at com.example.finishdemo.Hoadon$LoadData.onPreExecute(Hoadon.java:291)
12-12 11:08:33.347: E/WindowManager(1384):  at android.os.AsyncTask.execute(AsyncTask.java:391)
12-12 11:08:33.347: E/WindowManager(1384):  at com.example.finishdemo.Hoadon$4$1.run(Hoadon.java:246)
12-12 11:08:33.347: E/WindowManager(1384):  at android.os.Handler.handleCallback(Handler.java:587)
12-12 11:08:33.347: E/WindowManager(1384):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-12 11:08:33.347: E/WindowManager(1384):  at android.os.Looper.loop(Looper.java:130)
12-12 11:08:33.347: E/WindowManager(1384):  at android.app.ActivityThread.main(ActivityThread.java:3683)
12-12 11:08:33.347: E/WindowManager(1384):  at java.lang.reflect.Method.invokeNative(Native Method)
12-12 11:08:33.347: E/WindowManager(1384):  at java.lang.reflect.Method.invoke(Method.java:507)
12-12 11:08:33.347: E/WindowManager(1384):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
12-12 11:08:33.347: E/WindowManager(1384):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
12-12 11:08:33.347: E/WindowManager(1384):  at dalvik.system.NativeStart.main(Native Method)
4

1 に答える 1

2

UI 要素 (この場合は Toasts) を参照することはできませんdoInBackground()。おそらくエラーメッセージを文字列に保存してから、 に表示する必要がありますonPostExecute()

トーストをよく見ると、小さなトーストに非常に長いメッセージを表示しようとしています。通常、この情報はユーザーには使用されないため、ユーザーには公開されません。最も基本的なレベルでは、デザイナーは以下を使用します。

catch(Exception e) {
    e.printStackTrace();
}

追加
上記の手法により、アプリのクラッシュは停止しますが、指摘したように、SQLite はまだ例外をスローしています。String を正しく使用していないことに気付きました。

Cursor mCursor = mDB.query(true, DB_TABLE, 
    new String[] {NUMBER, INVOICEID, SNAME, NUMBERPHONE, ADDRESS, URL, STATUS}, 
    INVOICEID + "=" + mahoadon, null, null, null, null, null);

正しい構文は次のとおりです。

INVOICEID + "='" + mahoadon + "'"

selectionArgsパラメータを使用するのが最善ですが:

Cursor mCursor = mDB.query(true, DB_TABLE, 
    new String[] {NUMBER, INVOICEID, SNAME, NUMBERPHONE, ADDRESS, URL, STATUS}, 
    INVOICEID + "=?", new String[] {mahoadon}, null, null, null, null);

これにより、SQL インジェクションと発生する可能性のあるキャッシュの問題が防止されます。

于 2012-12-12T04:19:45.433 に答える