java 想在Sqlite数据库中插入json数据

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17441031/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-01 01:59:40  来源:igfitidea点击:

Want to insert json data into the Sqlite Database

javaandroidsqljson

提问by Karthick M

I want to store an json data to db,it has to display my apps has to display some previous data without internet time also.For that i want to create an db for json data to store.

我想将一个 json 数据存储到 db,它必须显示我的应用程序还必须显示一些没有互联网时间的以前的数据。为此,我想为 json 数据创建一个 db 来存储。

This is the db part i created for json data.

这是我为 json 数据创建的 db 部分。

public class GinfyDbAdapter {

    private static final String DATABASE_NAME = "ginfy.db";
    private static final String DATABASE_TABLE_PROJ = "prayers";
    private static final int DATABASE_VERSION = 2;
    public static final String CATEGORY_COLUMN_ID = "id";
    public static final String CATEGORY_COLUMN_TITLE = "title";
    public static final String CATEGORY_COLUMN_CONTENT = "content";
    public static final String CATEGORY_COLUMN_COUNT = "count";


    private static final String TAG = "ProjectDbAdapter";
    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    public GinfyDbAdapter(MainActivity mainActivity) {
        // TODO Auto-generated constructor stub
    }

    public GinfyDbAdapter GinfyDbAdapter(Context context){
        mDbHelper = new DatabaseHelper(context);

        mDb = mDbHelper.getWritableDatabase();
         return this;
    }

    public void saveCategoryRecord(String id, String title, String content, String count) {
        ContentValues contentValues = new ContentValues();
        contentValues.put(CATEGORY_COLUMN_ID, id);
        contentValues.put(CATEGORY_COLUMN_TITLE, title);
        contentValues.put(CATEGORY_COLUMN_CONTENT, content);
        contentValues.put(CATEGORY_COLUMN_COUNT, count);
        mDb.insert(DATABASE_NAME, null, contentValues);
        }
    public Cursor getTimeRecordList() {
        return mDb.rawQuery("select * from " + DATABASE_NAME, null);
        }
    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }



    private static final String DATABASE_CREATE_PROJ =
            "create table " + DATABASE_TABLE_PROJ + " ("
                    + CATEGORY_COLUMN_ID + " integer primary key autoincrement, "
                    + CATEGORY_COLUMN_TITLE + " text not null, " + CATEGORY_COLUMN_CONTENT + " text not null, " + CATEGORY_COLUMN_COUNT + " integer primary key autoincrement   );" ;

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("CREATE TABLE " + DATABASE_TABLE_PROJ + "( "
                + CATEGORY_COLUMN_ID + " INTEGER PRIMARY KEY, "
                + CATEGORY_COLUMN_TITLE + " TEXT, " + CATEGORY_COLUMN_CONTENT + " TEXT, " + CATEGORY_COLUMN_COUNT + " INTEGER PRIMARY KEY )" );

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS"+ DATABASE_NAME);
        onCreate(db);
    }

}


}

this is mainactivity which is showing listview

这是显示列表视图的主要活动

public class MainActivity extends Activity implements FetchDataListener,OnClickListener{
    private static final int ACTIVITY_CREATE=0;
    private static final String TAG_CATEGORY = "post";
    private static final String CATEGORY_COLUMN_ID = "id";
    private static final String CATEGORY_COLUMN_TITLE = "title";
    private static final String CATEGORY_COLUMN_CONTENT = "content";
    private static final String CATEGORY_COLUMN_COUNT = "count";
    private static final int Application = 0;
    private ProgressDialog dialog;
    ListView lv;
    ListView lv1;
    private List<Application> items;
    private Button btnGetSelected;
    private Button praycount;
    public int pct;
    private String stringVal;
    private TextView value;
    private int prayers;
    private int prayerid;
    EditText myFilter;
    ApplicationAdapter adapter;
     private GinfyDbAdapter mDbHelper;
     JSONArray contacts = null;
        private SimpleCursorAdapter dataAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_item); 
        mDbHelper=new GinfyDbAdapter(MainActivity.this);

        lv1 =(ListView)findViewById(R.id.list); 
        lv =(ListView)findViewById(R.id.list);

         ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();

            // Creating JSON Parser instance
            //JSONParser jParser = new JSONParser();
            JSONObject jsonObject = new JSONObject();
            //JSONArray aJson = jsonObject.getJSONArray("post");
            String url = "http://www.ginfy.com/api/v1/posts.json";
            // getting JSON string from URL
            JSONArray aJson = jsonObject.getJSONFromUrl(url);

            try {
                // Getting Array of Contacts
                contacts = aJson.getJSONObject(TAG_CATEGORY);

                // looping through All Contacts
                for(int i = 0; i < contacts.length(); i++){
                    JSONObject c = contacts.getJSONObject(i);

                    // Storing each json item in variable
                    String id = c.getString(CATEGORY_COLUMN_ID);
                    String title = c.getString(CATEGORY_COLUMN_TITLE);
                    String  content = c.getString(CATEGORY_COLUMN_CONTENT);
                    String  count = c.getString(CATEGORY_COLUMN_COUNT);

                    mDbHelper.saveCategoryRecord(id,title,content,count);

                    // creating new HashMap
                    HashMap<String, String> map = new HashMap<String, String>();

                    // adding each child node to HashMap key => value
                    map.put(CATEGORY_COLUMN_ID, id);
                    map.put(CATEGORY_COLUMN_TITLE, title);
                    map.put(CATEGORY_COLUMN_CONTENT, content);
                    map.put(CATEGORY_COLUMN_COUNT, count);
                    // adding HashList to ArrayList
                    contactList.add(map);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }





        btnGetSelected = (Button) findViewById(R.id.btnget);
        btnGetSelected.setOnClickListener(this);

        myFilter = (EditText) findViewById(R.id.myFilter);




        //praycount.setOnClickListener(this);
        initView();
    }

    private void initView(){
        // show progress dialog
        dialog = ProgressDialog.show(this, "", "Loading...");
        String url = "http://www.ginfy.com/api/v1/posts.json";
        FetchDataTask task = new FetchDataTask(this);
        task.execute(url);


    }   

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

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        createProject();
        return super.onMenuItemSelected(featureId, item);
    }

    private void createProject() {
        Intent i = new Intent(this, AddPrayerActivity.class);
        startActivityForResult(i, ACTIVITY_CREATE);   
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        initView();
    }

    @Override
    public void onFetchComplete(List<Application> data){
        this.items = data;
        // dismiss the progress dialog
        if ( dialog != null )
            dialog.dismiss();
        // create new adapter
        ApplicationAdapter adapter = new ApplicationAdapter(this, data);
        /*dataAdapter adapter = new SimpleCursorAdapter(this,
                    R.layout.activity_row,
                    new String[] { CATEGORY_COLUMN_TITLE, CATEGORY_COLUMN_CONTENT, CATEGORY_COLUMN_COUNT }, new int[] {
                            R.id.text2, R.id.text1, R.id.count });*/

           //lv.setListAdapter(adapter);
        // set the adapter to list
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                CheckBox chk = (CheckBox) view.findViewById(R.id.checkbox);
                Application bean = items.get(position);
                if (bean.isSelected()) {
                    bean.setSelected(false);
                    chk.setChecked(false);
                } else {
                    bean.setSelected(true);
                    chk.setChecked(true);
                }

            }
        });
    }

    // Toast is here...
    private void showToast(String msg) {
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFetchFailure(String msg){
        if ( dialog != null )
            dialog.dismiss();
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
    }

Before using db it shows in listview also,rite now i want to make db also,for that i wrote some code in mainactivity.

在使用 db 之前,它也显示在列表视图中,现在我也想制作 db,为此我在 mainactivity 中编写了一些代码。

Fetchdatatask.java

获取数据任务.java

public class FetchDataTask extends AsyncTask<String, Void, String>
{
    private final FetchDataListener listener;
    private  OnClickListener onClickListener;
    private String msg;

    public FetchDataTask(FetchDataListener listener)
    {
        this.listener = listener;
    }



    @Override
    protected String doInBackground(String... params)
    {
        if ( params == null )
            return null;
        // get url from params
        String url = params[0];
        try
        {
            // create http connection
            HttpClient client = new DefaultHttpClient();
            HttpGet httpget = new HttpGet(url);
            // connect
            HttpResponse response = client.execute(httpget);
            // get response
            HttpEntity entity = response.getEntity();
            if ( entity == null )
            {
                msg = "No response from server";
                return null;
            }
            // get response content and convert it to json string
            InputStream is = entity.getContent();
            return streamToString(is);
        }
        catch ( IOException e )
        {
            msg = "No Network Connection";

        }
        return null;
    }

    @Override
    protected void onPostExecute(String sJson)
    {
        if ( sJson == null )
        {
            if ( listener != null )
                listener.onFetchFailure(msg);
            return;
        }
        try
        {
            // convert json string to json object
            JSONObject jsonObject = new JSONObject(sJson);
            JSONArray aJson = jsonObject.getJSONArray("post");
            // create apps list
            List<Application> apps = new ArrayList<Application>();
            for ( int i = 0; i < aJson.length(); i++ )
            {
                JSONObject json = aJson.getJSONObject(i);
                Application app = new Application();
                app.setContent(json.getString("content"));
                app.setTitle(json.getString("title"));
                 app.setCount(Integer.parseInt(json.getString("count"))); 
                 app.setId(Integer.parseInt(json.getString("id")));



                // add the app to apps list
                apps.add(app);


            }
            //notify the activity that fetch data has been complete
            if ( listener != null )
                listener.onFetchComplete(apps);
        }
        catch ( JSONException e )
        {
            e.printStackTrace();
            msg = "Invalid response";
            if ( listener != null )
                listener.onFetchFailure(msg);
            return;
        }
    }

    /**
     * This function will convert response stream into json string
     * 
     * @param is
     *            respons string
     * @return json string
     * @throws IOException
     */
    public String streamToString(final InputStream is) throws IOException
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        StringBuilder sb = new StringBuilder();
        String line = null;
        try
        {
            while ( (line = reader.readLine()) != null )
            {
                sb.append(line + "\n");
            }
        }
        catch ( IOException e )
        {
            throw e;
        }
        finally
        {
            try
            {
                is.close();
            }
            catch ( IOException e )
            {
                throw e;
            }
        }
        return sb.toString();
    }
}

This fetchdatatask fetch from json and showing in listview,i want that without internet time it has to show in listview also for that i am creating db.

这个fetchdatatask从json中获取并显示在listview中,我希望没有互联网时间它也必须显示在listview中,因为我正在创建db。

can you check my code is correct,actually it showing error in mainactivity line JSONArray aJson = jsonObject.getJSONFromUrl(url);

你能检查一下我的代码是否正确,实际上它在主要活动行 JSONArray aJson = jsonObject.getJSONFromUrl(url) 中显示错误;

回答by Naresh Sharma

Create a class which act's as the intermediate between your Db class and the main activity to insert the data into the db and vice versa

创建一个类,作为 Db 类和主要活动之间的中间体,将数据插入到 db 中,反之亦然

public class Category {

    String id; 
    String title; 
    String content;
    String count;
    public Category(String id, String title, String content, String count) {
        super();
        this.id = id;
        this.title = title;
        this.content = content;
        this.count = count;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getCount() {
        return count;
    }
    public void setCount(String count) {
        this.count = count;
    }
}

In your main activity where you do the json parsing create an object of DB class and call one the save record method at there like i did below

在您进行 json 解析的主要活动中,创建一个 DB 类的对象并在那里调用一个保存记录方法,就像我在下面所做的那样

DatabaseHelper mDbHelper;
public class ABC extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.abc);
                mDbHelper= new DatabaseHelper (this);
                new GetSyncDataAsyncTask().execute();

    }   
}


    private class GetDataAsyncTask extends AsyncTask<Void, Void, Boolean> {
            private ProgressDialog Dialog = new ProgressDialog(ABC.this);

            protected void onPreExecute() {
                Dialog.setMessage("Loading.....");
                Dialog.show();
            }
            @Override
            protected void onPostExecute(Boolean result) {
                super.onPostExecute(result);
                Dialog.dismiss();
                Intent intent = new Intent(ABC.this, XYZ.class);
                startActivity(intent);
            }
            @Override
            protected Boolean doInBackground(Void... params) {
                getData();
                return null;
            }
        }


    public void getProdData() {
        // getting JSON string from URL
        JSONParser parser = new JSONParser();
        JSONObject jsonObject = new JSONObject();
            //JSONArray aJson = jsonObject.getJSONArray("post");
            String url = "http://www.ginfy.com/api/v1/posts.json";
            // getting JSON string from URL
            JSONArray aJson = jsonObject.getJSONFromUrl(url);

            try {
                // Getting Array of Contacts
                contacts = aJson.getJSONObject(TAG_CATEGORY);

                // looping through All Contacts
                for(int i = 0; i < contacts.length(); i++){
                    JSONObject c = contacts.getJSONObject(i);

                    // Storing each json item in variable
                    String id = c.getString(CATEGORY_COLUMN_ID);
                    String title = c.getString(CATEGORY_COLUMN_TITLE);
                    String  content = c.getString(CATEGORY_COLUMN_CONTENT);
                    String  count = c.getString(CATEGORY_COLUMN_COUNT);

                    mDbHelper.saveCategoryRecord(new Category(id,title,content,count));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

At last in your db class insert the values like below

最后在您的 db 类中插入如下值

public void saveCategoryRecord(Category category) {

        String query = "insert into"+ TABLE_NAME+ values( ?, ?, ?, ?, ?, ? )";
        SQLiteStatement stmt = mDb.compileStatement(query);
        stmt.bindString(1, category.getId());
        stmt.bindString(2, category.getTitle());
        stmt.bindString(3, category.getContent());
        stmt.bindString(4, category.getCount());
        stmt.execute();
    }

I have tried to use the same things as you have used. This is the way i think now you got the concept to do that

我尝试使用与您使用的相同的东西。这就是我认为的方式,现在你有了这样做的概念