如何在更新时覆盖我的数据库

时间:2011-12-04 15:53:32

标签: android database

我正在数据库中搜索一些我从rss获得的新闻。我的问题是我希望新的提要覆盖旧的。我希望每次在我的数据库中有10条新闻,但现在我每次都刷新再多10个..

在网上搜索我发现解决方案必须是onUpgrade方法。你能帮我这么做吗?这就是我现在使用的onUpgrade:

public void onUpgrade (SQLiteDatabase db,int oldVersion, int newVersion){
    android.util.Log.w("Constants",
            "Upgrading database, which will destroy all data"); 
    db.execSQL("DROP TABLE IF EXISTS myDB");
    onCreate(db);

}

修改

public void createEntry(String string,String string2,String string3,String string4,String string5){
    ContentValues cv=new ContentValues();
    cv.put(DBHelper.TITLE, string);
    cv.put(DBHelper.AGONISTIKI, string2);
    cv.put(DBHelper.SKOR, string3);
    cv.put(DBHelper.GIPEDO, string4);
    cv.put(DBHelper.DATE, string5);
    try
    {
        ourDatabase.insert("osfpDB",null,cv);
    }
    catch(Exception e)
    {
        Log.e("DB ERROR ON .INSERT", e.toString()); // prints the error message to the log
        e.printStackTrace(); // prints the stack trace to the log
    }

}
public void update(String string,String string2,String string3,String string4,String string5){
    ContentValues cv=new ContentValues();
    cv.put(DBHelper.TITLE, string);
    cv.put(DBHelper.AGONISTIKI, string2);
    cv.put(DBHelper.SKOR, string3);
    cv.put(DBHelper.GIPEDO, string4);
    cv.put(DBHelper.DATE, string5);
    try
    {
        ourDatabase.update("osfpDB",cv,DBHelper.ROWID,null);
    }
    catch(Exception e)
    {
        Log.e("DB ERROR ON .UPDATE", e.toString()); // prints the error message to the log
        e.printStackTrace(); // prints the stack trace to the log
    }

}

 ArrayList<HashMap<String, String>> List_agones = new ArrayList<HashMap<String, String>>(messages.size());
            for (Message2 msg : messages){

                des.add(msg.getDescription());//keimeno
                SK.add(msg.getskor());
                GOALA.add(msg.getgoal1());
                GOALB.add(msg.getgoal2());
                TITLES.add(msg.getTitle());
                AGONISTIKI.add(msg.getagonistiki());


                 HashMap<String, String> map = new HashMap<String, String>();
                    map.put("agon", msg.getagonistiki());

                map.put("name", msg.getTitle());
                map.put("date", msg.getDate());
                map.put("gip", msg.getgipedo());

                map.put("SK", msg.getskor());

               List_agones.add(map);

                ListAdapter mSchedule = new SimpleAdapter(this, List_agones, R.layout.agonesrow,
                            new String[] {"agon","name", "date","gip", "SK"}, new int[] {R.id.TextView00,R.id.TextView01, R.id.TextView02, R.id.TextView04, R.id.TextView03});
                this.setListAdapter(mSchedule);


                //grafei stin vasi dedomenwn
                //-------------------------
                HotOrNot entry=new HotOrNot(agones.this);

                   entry.open();
                   if(map== null){

                       Toast.makeText(agones.this, "1",
                                Toast.LENGTH_SHORT).show();
                      entry.createEntry(msg.getTitle(),msg.getagonistiki(),msg.getskor(),msg.getgipedo(),msg.getDate());
                   }else{

                       Toast.makeText(agones.this, "2",
                                Toast.LENGTH_SHORT).show();
                      entry.update(msg.getTitle(),msg.getagonistiki(),msg.getskor(),msg.getgipedo(),msg.getDate());
                   }

                   entry.close();
                //----------------------------------------

2 个答案:

答案 0 :(得分:0)

当用户更新应用程序和数据库的版本并处理将旧数据库版本的数据移植到新数据库时,将调用onUpgrade。您可以使用SqlLiteDatabase类对数据库中的记录调用插入,更新和删除。所以你必须这样说:

if NumberOfRecords == 10
   delete oldest recodr
insert new record

您可以在此处查看插入,更新和删除方法的实现http://www.vogella.de/articles/AndroidSQLite/article.html

答案 1 :(得分:0)

您不必删除并重新创建新Feed的数据库。只需更新数据库中的10行。

编辑:

我现在正在工作,没有太多时间仔细阅读细节 你应该做的是(我只添加了行id),其中rowId是1到10.

public void update(String string,String string2,String string3,String string4,String string5, rowId){
    ContentValues cv=new ContentValues();
    cv.put(DBHelper.TITLE, string);
    cv.put(DBHelper.AGONISTIKI, string2);
    cv.put(DBHelper.SKOR, string3);
    cv.put(DBHelper.GIPEDO, string4);
    cv.put(DBHelper.DATE, string5);
    try
    {
        ourDatabase.update("osfpDB",cv,rowId,null);
    }
    catch(Exception e)
    {
        Log.e("DB ERROR ON .UPDATE", e.toString()); // prints the error message to the log
        e.printStackTrace(); // prints the stack trace to the log
    }

}

因此您每次都要传递要更新的行ID。在循环。使用行id创建一个计数器,例如:

for (int i = 1; i <= 10; i++)
{
     update(string1, string2, string 3 /*blah blah blah*/, i);
}

。为你做更新。

需要注意的另一件事是,在创建数据库时,插入10行的虚拟数据。在进行任何更新之前,应该存在10行(或者您需要的w / e行数)。如果记录不存在。更新将失败。将在下班后深入了解您的代码。抱歉。

编辑:

确定。这样的事情。但我不知道你的createEntry有什么用处。介意显示代码或解释?就像我说的。插入10个空行并对其进行更新。 Laters。

 int rowId = 1;
 for (Message2 msg : messages){

            des.add(msg.getDescription());//keimeno
            SK.add(msg.getskor());
            GOALA.add(msg.getgoal1());
            GOALB.add(msg.getgoal2());
            TITLES.add(msg.getTitle());
            AGONISTIKI.add(msg.getagonistiki());


             HashMap<String, String> map = new HashMap<String, String>();
                map.put("agon", msg.getagonistiki());

            map.put("name", msg.getTitle());
            map.put("date", msg.getDate());
            map.put("gip", msg.getgipedo());

            map.put("SK", msg.getskor());

           List_agones.add(map);

            ListAdapter mSchedule = new SimpleAdapter(this, List_agones, R.layout.agonesrow,
                        new String[] {"agon","name", "date","gip", "SK"}, new int[] {R.id.TextView00,R.id.TextView01, R.id.TextView02, R.id.TextView04, R.id.TextView03});
            this.setListAdapter(mSchedule);


            //grafei stin vasi dedomenwn
            //-------------------------
            HotOrNot entry=new HotOrNot(agones.this);

               entry.open();
               if(map== null){

                   Toast.makeText(agones.this, "1",
                            Toast.LENGTH_SHORT).show();
                  entry.createEntry(msg.getTitle(),msg.getagonistiki(),msg.getskor(),msg.getgipedo(),msg.getDate());
               }else{

                   Toast.makeText(agones.this, "2",
                            Toast.LENGTH_SHORT).show();
                  entry.update(msg.getTitle(),msg.getagonistiki(),msg.getskor(),msg.getgipedo(),msg.getDate(), rowId++);
               }

               entry.close();
            //----------------------------------------