android:将json保存到sqlite

时间:2014-12-23 08:11:56

标签: java android json sqlite

我是android和java的新bie我想将一个表从sql server(外部数据库)保存到sqlite(内部数据库)。 1.当我在sqlite浏览器中打开db文件时,我的json没有被存储,每个记录都像这个“com.example.db_client.DeptTable@b3e4e9e0”一样。我不明白这是什么。

  1. 当我运行我的应用程序时,我有时会得到此异常,有时我不会。

    致命的例外:主要 处理:com.example.db_client,PID:1697 java.lang.IllegalArgumentException:Activity DeptActivity没有指定父活动名称。 (您是否忘记在清单中添加android.support.PARENT_ACTIVITY元素?)

  2. 我真的需要帮助,请查看我的问题。提前谢谢。

    数据库助手类的代码

        public class SqliteDB {
    
        public static final String KEY_ID = "no";
        public static final String KEY_NAME = "name";
    
        private static final String TAG = "DBAdapter";
        private static final String DATABASE_NAME = "SQLiteDB";
    
        private static final String TABLE_NAME = "Department";
        private static final int DATABASE_VERSION = 2;
    
        private static final String CREATE_TABLE = 
                "create table departmentList (id INTEGER PRIMARY KEY, name TEXT);";
        private final Context context;
        private DatabaseHelper DBHelper;
        private SQLiteDatabase db;
    
        public SqliteDB(Context ctx) {
    
            this.context = ctx;
            DBHelper = new DatabaseHelper(context);
        }
        private static class DatabaseHelper extends SQLiteOpenHelper {
            DatabaseHelper(Context context) {           
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
    
        @Override
            public void onCreate(SQLiteDatabase db) {           
                try {
                        db.execSQL(CREATE_TABLE);
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {   
                Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                        + newVersion + ", which will destroy all old data");
                db.execSQL("DROP TABLE IF EXISTS sample");
                onCreate(db);
                }
            }
    
      //---open SQLite DB---
        public SqliteDB open() throws SQLException {    
            db = DBHelper.getWritableDatabase();
            return this;
        }
    
        //---close SQLite DB---
        public void close() {   
            DBHelper.close();
        }
    
        //---insert data into SQLite DB---
        public long insert(String name) {
            ContentValues initialValues = new ContentValues();
            initialValues.put(KEY_NAME, name);      
            return db.insert(TABLE_NAME, null, initialValues);
        }
    
        //---Delete All Data from table in SQLite DB---
        public void deleteAll() {
            db.delete(TABLE_NAME, null, null);
        }
    
        //---Get All Contacts from table in SQLite DB---
        public Cursor getAllData() {
            return db.query(TABLE_NAME, new String[] {KEY_NAME}, 
                    null, null, null, null, null);
        }
    
    }
    

    活动类代码

    public class DeptActivity extends Activity{
    
    
        ArrayAdapter<String> adapter;
        ListView listv;
        Context context;
        ArrayList<String> data;
        SqliteDB sqlite;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_dept);
    
              sqlite = new SqliteDB(DeptActivity.this);
    
              setupActionBar();
              data = new ArrayList<String>();
              listv = (ListView) findViewById(R.id.lv_dept);
              context = this;
    
              adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, data);
              listv.setAdapter(adapter);
              Toast.makeText(this,"Loading Please Wait..",Toast.LENGTH_SHORT).show();
              new AsyncLoadDeptDetails().execute();
        }
        public class AsyncLoadDeptDetails extends
              AsyncTask<Void, JSONObject, ArrayList<DeptTable>> {
              ArrayList<DeptTable> deptTable = null;
    
              @Override
              public ArrayList<DeptTable> doInBackground(Void... params) {
                    // TODO Auto-generated method stub
    
                    RestAPI api = new RestAPI();
                    try {
                           JSONObject jsonObj = api.GetDepartmentDetails();
                           JSONParser parser = new JSONParser();
                           Log.i( "department list", jsonObj.toString()); 
                           deptTable = parser.parseDepartment(jsonObj);
                           sqlite();
    
                    } catch (Exception e) {
                    }
              return deptTable;
          }
    
    
             private void sqlite() {
                // TODO Auto-generated method stub
    
                sqlite.open();
            for(int i=0; i<deptTable.size(); i++) {
    
                    sqlite.insert(deptTable.get(i).toString());
    
                }
    
                sqlite.close();
            }   
    
              @Override
              protected void onPostExecute(ArrayList<DeptTable> result) {
                    // TODO Auto-generated method stub
    
                    for (int i = 0; i < result.size(); i++) {
                          data.add(result.get(i).getNo() + " " + result.get(i).getName());
                    }
    
                    adapter.notifyDataSetChanged();
    
                    Toast.makeText(context,"Loading Completed",Toast.LENGTH_SHORT).show();
              } }
    

    我希望在sqlite db中保存的表看起来像这样。 没有。名称 1工程 2财务 3商业

    公共类DeptTable {

     int no;
     String name;
    
     public DeptTable(int no, String name) {
           super();
           this.no = no;
           this.name = name;
     }
    

    deptTable类的代码

    public DeptTable() {
           super();
           this.no=0;
           this.name = null;
     }
    
     public int getNo() {
           return no;
     }
     public void setNo(int no) {
           this.no = no;
     }
     public String getName() {
           return name;
     }
     public void setName(String name) {
           this.name = name;
     }
    

    } json解析器类的代码

    public class JSONParser  {
    
    public JSONParser()
    {
    super();
    }
    
    public ArrayList<DeptTable> parseDepartment(JSONObject object)
    {
          ArrayList<DeptTable> arrayList=new ArrayList<DeptTable>();
          try {
                JSONArray jsonArray=object.getJSONArray("Value");
                JSONObject jsonObj=null;
                for(int i=0;i<jsonArray.length();i++)
                {
                      jsonObj =jsonArray.getJSONObject(i);
                      arrayList.add(new DeptTable(jsonObj.getInt("no"), jsonObj.getString("name")));
                }
    
          } catch (JSONException e) {
                // TODO Auto-generated catch block
                Log.d("JSONParser => parseDepartment", e.getMessage());
          }
          return arrayList;
    }
    
    public boolean parseUserAuth(JSONObject object)
    {     boolean userAtuh=false;
                try {
                      userAtuh = object.getBoolean("Value");
                } catch (JSONException e) {
                      // TODO Auto-generated catch block
                      Log.d("JSONParser => parseUserAuth", e.getMessage());
                }
    
                return userAtuh; }
    

    清单代码     

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
    
    <uses-permission android:name="android.permission.INTERNET" />
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.db_client.DeptActivity"
            android:label="@string/app_name" >
         </activity>
    
    </application>
    </manifest>
    

    在这里输入代码

1 个答案:

答案 0 :(得分:1)

如果你想使用toString方法,那么类必须实现toString方法,否则它只会返回对象的默认值,而你发现它并不是那么有用。 (这&#34; com.example.db_client.DeptTable@b3e4e9e0")。要实现它,只需键入就像这样。

@Override
public String toString() {
    //What you want to return here.
}

但是我猜你想要为数据库添加一些值,所以你想要像这样调用你的类的getter方法。

private void sqlite() {
    sqlite.open();
    for(int i=0; i<deptTable.size(); i++) {
        sqlite.insert(deptTable.get(i).getName());
    }
    sqlite.close();
}

你需要像这样将android:parentActivityName字段添加到DeptActivity。

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="21" />

<uses-permission android:name="android.permission.INTERNET" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.example.db_client.DeptActivity"
        android:label="@string/app_name"
        android:parentActivityName=".MainActivity">
     </activity>

</application>
</manifest>