Android 如何确保在sqlite中只插入一次数据

Android 如何确保在sqlite中只插入一次数据,android,database,android-sqlite,Android,Database,Android Sqlite,我使用的是web服务,它以JSON格式返回数据,如下所示: {"content":[{"id":"1","asset_id":"62","title":"sample page","alias":"","introtext":"","fulltext":"Some Contents"},{"id":"2","asset_id":"62","title":"sample page2","alias":"","introtext":"","fulltext":"Some Contents"},{"i

我使用的是
web服务
,它以
JSON
格式返回数据,如下所示:

{"content":[{"id":"1","asset_id":"62","title":"sample page","alias":"","introtext":"","fulltext":"Some Contents"},{"id":"2","asset_id":"62","title":"sample page2","alias":"","introtext":"","fulltext":"Some Contents"},{"id":"3","asset_id":"62","title":"sample page3","alias":"","introtext":"","fulltext":"Some Contents"}]}
MainActivity.java的
onCreate()
是:

boolean myFlag = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);     
    textView = (TextView) findViewById(R.id.myView);

    setFlag = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);

    dataSource = new ContentsDataSource(this);
    dataSource.open();
    parseAndIsertData();

}
parseAndInsertData()
是:

boolean myFlag = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);     
    textView = (TextView) findViewById(R.id.myView);

    setFlag = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);

    dataSource = new ContentsDataSource(this);
    dataSource.open();
    parseAndIsertData();

}
编辑

private void parseAndIsertData() {
    // Creating JSON Parser instance
    MyJSONParser jParser = new MyJSONParser();

    contentDataObject = new ContentDataObject();        
    // getting JSON string from URL
    JSONObject json = jParser.getJSONFromUrl(BASE_URL); 

    try {
        // first time check if data is inserted
        editor = setFlag.edit();
        editor.putBoolean(MY_KEY, true);            

        // Getting Array of Contents
        jsonArray = json.getJSONArray(MOBILE_CONTENT);          
        // looping through All Contents

        if(!myFlag){            

            for(int i = 0; i < jsonArray.length(); i++){

                contentDataObject.setId(jsonArray.getJSONObject(i).getInt(MOBILE_CONTENT_ID));
                contentDataObject.setTitle(jsonArray.getJSONObject(i).getString(MOBILE_CONTENT_TITLE));
                contentDataObject.setFulltext(jsonArray.getJSONObject(i).getString(MOBILE_CONTENT_FULLTEXT));
                contentDataObject.setState(jsonArray.getJSONObject(i).getInt(MOBILE_CONTENT_STATE));
                contentDataObject.setNewValue(jsonArray.getJSONObject(i).getInt(MOBILE_CONTENT_NEW));
                contentDataObject.setHeader(jsonArray.getJSONObject(i).getString(MOBILE_CONTENT_HEADER));
                contentDataObject.setColor(jsonArray.getJSONObject(i).getInt(MOBILE_CONTENT_COLOR));
                contentDataObject.setNext(jsonArray.getJSONObject(i).getString(MOBILE_CONTENT_NEXT));
                contentDataObject.setPrevious(jsonArray.getJSONObject(i).getString(MOBILE_CONTENT_PREVIOUS));

                contentDataObject = dataSource.create(contentDataObject);

                Log.i(MY_TAGT, "Data Inserted " + contentDataObject.getId() + " Times");

            }

            myFlag = setFlag.getBoolean(MY_KEY, false);

        }


    } catch (JSONException e) {
        e.printStackTrace();
    }
}}
private void parseAndIsertData(){
//创建JSON解析器实例
MyJSONParser jParser=新的MyJSONParser();
contentDataObject=新的contentDataObject();
//从URL获取JSON字符串
JSONObject json=jParser.getJSONFromUrl(基本URL);
试一试{
//首次检查是否插入了数据
editor=setFlag.edit();
putBoolean(MY_KEY,true);
//获取内容数组
jsonArray=json.getJSONArray(移动内容);
//循环浏览所有内容
如果(!myFlag){
for(int i=0;i
现在,我的
logcat
首次发布是:

当我重新启动应用程序时,我的
logcat
是:

现在我想问一下,如果
,这个方法是否正确!那我以后就可以更新了!!

谢谢

此代码将多次插入数据,这是正确的。实现一个只允许一行的模式将取决于您

您需要先查询数据源,如果数据存在,则不插入数据,或者需要从数据源中删除数据,然后每次插入数据。还有其他模式,但这两种模式将是最常见的。您选择哪一个取决于数据是什么以及您希望如何维护或更新数据

  • 将表中的列定义为
    主键
    唯一
  • 使用
    SQLiteDatabase.insertWithOnConflict(…)
    并将
    conflictAlgorithm
    参数(最后一个)设置为``SQLiteDatabase.CONFLICT\u IGNORE`

  • 请参阅创建ur表以避免在数据库中插入数据后重复插入列请在
    SharedReferences中存储一些标志,如果成功插入,则将其存储为true,否则为false,并在从服务器请求数据之前在活动的一次创建中检查SharedReferences标志值,如果为true,则表示无需请求如果再次出现错误,请向服务器发出请求。我已经尝试了很多次,但如果您能给我一些示例,我无法得到结果!!对于您想要的示例,请使用最新的代码编辑您的问题,然后我将尝试帮助您。好的,我将向您展示最新的代码,看看它是否正确,因为我希望数据不应反复插入,但将来可能会更新!!首先感谢您的回答,现在我想问的是,我们一次又一次地删除和插入数据是否是一种良好的做法?这不会影响应用程序的性能吗?这取决于您的数据。如果这是一行不经常更新的静态数据,那么delete/insert可以保证最大的正确性。如果这是大量正在更改的数据行,那么删除/插入将是一个错误的选择。在这种情况下,您的数据应该有一个主键,您可以使用它来确定数据的存在并处理更新。我建议不要将数据写入一个数据存储(如SQLite),然后使用另一个数据存储(如首选项)中的内容来确定是否写入了第一个存储。如果事情变得复杂,这可能会导致真正的不匹配。