继续得到“SQLiteException:no such table”异常

时间:2012-12-05 13:54:17

标签: java android exception android-sqlite

我尝试创建SQLiteDatabase以保留我从JSONObject获取的数据来自post请求。 我的主要课程:

public class MainActivity extends Activity {

    static JSONObject result;
    public Context mContext;
    public SQLiteDatabase db;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = getApplicationContext();
       new UpdateData().execute();


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    private class UpdateData extends AsyncTask<String, Void, JSONObject>{

        private JSONObject object;
            @Override
            protected JSONObject doInBackground(String... params) {
                try {
                    HttpClient client = new DefaultHttpClient();  
                    String postURL = "http://test.com";
                    HttpPost post = new HttpPost(postURL);
                        List<NameValuePair> crc = new ArrayList<NameValuePair>();
                        crc.add(new BasicNameValuePair("crc", "test"));
                        UrlEncodedFormEntity ent = new UrlEncodedFormEntity(crc,HTTP.UTF_8);
                        post.setEntity(ent);
                        HttpResponse responsePOST = client.execute(post);  
                        HttpEntity entit = responsePOST.getEntity();
                        String retSrc = EntityUtils.toString(entit);
                        object = new JSONObject(retSrc);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return object;
            }
            @Override
            protected void onPostExecute(JSONObject result) {
                MainActivity.this.result = result;
                DataBase dbHelper = new DataBase(mContext) ;
                db = dbHelper.getWritableDatabase(); 
                dbHelper.createDB(db, result);  
                /*Cursor cursor = db.query("departments", null , null,
                        null, null, null, null, null);
                System.out.println(cursor.getString(1));*/
                }

    }
}

和DataBaseHelper

public class DataBaseHelper extends SQLiteOpenHelper {

    public boolean isDownloaded = false; 
    public boolean shutdown = false;

    private Context mContext;
    private JSONObject exams;
    private JSONObject specs;
    private JSONObject deps;

    private static final int DATABASE_VERSION = 2;
    private static final String DATABASE_NAME = "data.db";

    private static final String EXAMS_TABLE_NAME = "exams";
    private static final String EXAMS_TABLE_CREATE =
                "CREATE TABLE " + EXAMS_TABLE_NAME + " (" +
                "id VARCHAR (255), " +              //0
                "name VARCHAR (255)," +             //1
                "type VARCHAR (100)," +             //2
                "level VARCHAR (100),"  + ");" ;    //3


    private static final String SPEC_TABLE_NAME = "specializations";
    private static final String SPEC_TABLE_CREATE =
                "CREATE TABLE " + SPEC_TABLE_NAME + " (" +
                "id VARCHAR (255), " +                  //0
                "name VARCHAR (255)," +                 //1
                "name_en VARCHAR (255)," +          //2
                "description VARCHAR (255)," + ");" ;       //3

    private static final String DEP_TABLE_NAME = "departments";
    private static final String DEP_TABLE_CREATE =
                "CREATE TABLE " + DEP_TABLE_NAME + " (" +
                "id VARCHAR (255), " +                  //0
                "name VARCHAR (255)," +                 //1
                "name_en VARCHAR (255)," +          //2
                "www VARCHAR (255)," +                  //3
                "email VARCHAR (255)," +                //4
                "phone VARCHAR (100),"  + ");" ;        //5



    public DataBase(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub

    }

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

    }

    public boolean doesDBexist() {
        File db;
        db = new File("/data/data/my.package/databases/data.db");
        return db.exists();
    }

    public boolean createDB(SQLiteDatabase db, JSONObject jsonObject) {
        try { // if not working create new one
            exams = jsonObject.getJSONObject("exams");
            specs = jsonObject.getJSONObject("spec");
            deps = jsonObject.getJSONObject("department");
            db.execSQL(EXAMS_TABLE_CREATE);             // here I get exception (described below)
            db.execSQL(SPEC_TABLE_CREATE);
            db.execSQL(DEP_TABLE_CREATE);
            putContentValues(db);
            isDownloaded = true;
            return true;
        } catch (SQLiteException e1) {
            db = null;
            return false;
        } catch (Exception e3) {
            shutdown = true;
            return false;
        }
    }


        public void putContentValues(SQLiteDatabase db) throws JSONException    {
            ContentValues cv = new ContentValues();

            for (Iterator<String> it = exams.keys(); it.hasNext(); it.next()) {
                JSONObject exam = exams.getJSONObject(it.toString());
                cv.put("id", it.toString());
                cv.put("name", exam.getString("name"));
                cv.put("type", exam.getString("type"));
                cv.put("level", exam.getString("level"));
                db.insert(EXAMS_TABLE_NAME, null, cv);
                cv.clear();

            }

            for (Iterator<String> it = specs.keys(); it.hasNext(); it.next()) {
                JSONObject spec = specs.getJSONObject(it.toString());
                cv.put("id", it.toString());
                cv.put("name", spec.getString("name"));
                cv.put("name_en", spec.getString("name_en"));
                cv.put("desription", spec.getString("desription"));

                db.insert(SPEC_TABLE_NAME, null, cv);
                cv.clear();
            }

            for (Iterator<String> it = deps.keys(); it.hasNext(); it.next()) {
                JSONObject dep = deps.getJSONObject(it.toString());
                cv.put("id", it.toString());
                cv.put("name", dep.getString("name"));
                cv.put("name_en", dep.getString("name_en"));
                cv.put("www", dep.getString("www"));
                cv.put("email", dep.getString("email"));
                cv.put("phone", dep.getString("phone"));
                db.insert(DEP_TABLE_NAME, null, cv);
                cv.clear();
            }

        }

}

我无法调试它。当我在Cursor中创建MainActivity时,我会在行db.execSQL(EXAMS_TABLE_CREATE); android.database.sqlite.SQLiteException: no such table: departments: , while compiling: SELECT * FROM departments之后获得异常,当我不创建游标时,它会在调试时停在那里。我无法检查我的数据库中是否有任何内容以及它是否已经完成。 我试图重命名我的数据库,就像有人在这个问题中所说: android.database.sqlite.SQLiteException: no such table但它没有解决这个问题。

1 个答案:

答案 0 :(得分:7)

这是不正确的:

"CREATE TABLE " + EXAMS_TABLE_NAME + " (" +
            "id VARCHAR (255), " +              //0
            "name VARCHAR (255)," +             //1
            "type VARCHAR (100)," +             //2
            "level VARCHAR (100),"  + ");" ;

删除该create-statement中的最后一个“,”并再次尝试。

btw ...你在所有的创建语句中都犯了这个错误。