主同步数据库

时间:2013-09-30 05:31:15

标签: android android-sqlite

我正在将数据库与服务器同步,以便在单击按钮时获得任何增量值。下面是检查所有值和插入的代码,如果数据丢失但是从android的角度来看是否有任何优化的技术来进行同步

//new fields

    public void updatenewfileds(ArrayList<String> s) {

        ArrayList<String> da = new ArrayList<String>();

        try {
            String manu = "select MANUFACTURERID from ManufacturerDesc";
            Cursor cc = mDb.rawQuery(manu,null);

            Log.d("Cursor count", "Count =" + cc.getCount());
            if (cc != null && cc.getCount() > 0) {
                if (cc.moveToFirst());
                do {
                    da.add(cc.getString(cc.getColumnIndex("MANUFACTURERID")));
                    System.out.println("here got all alreday avilable ids"+ cc.getString(cc.getColumnIndex("MANUFACTURERID")));
                } while (cc.moveToNext());
                cc.close();
            } else {
                cc.close();
            }
            // need to add only missing data
            for(int i = 0; i<da.size(); i++){               
                boolean flag = false;
                System.out.println(flag);
                for(int j=0; j<i; j++){
                    if(da.get(i).equals(s.get(i*2))){
                        flag = true;
                        break;
                    }
                }

            if(flag  == false){
            String sql = "insert into ManufacturerDesc values('"+ s.get(i*2)+"','"+ s.get(i*2+1)+"');";
            System.out.println("item inserted into db"+ s.get(i*2) +"******" + s.get(i*2+1) );
            mDb.execSQL(sql);
            }
            }

        } catch (SQLException mSQLException) {
            Log.e(TAG, "getTestData >>" + mSQLException.toString());

            throw mSQLException;
        }

    }

1 个答案:

答案 0 :(得分:2)

这是我的建议,[]只是强调,因为我可能会回到它:

  • 设计您的Android数据库表格,例如:{_ id, [server_id] ,...您的数据..}
  • 在服务器上的所有表格中添加 [time_changed] 时间戳。
  • 每当您的设备与服务器同步时,服务器应另外发送上次同步时间戳,例如System.currentTimeMilliseconds()(让服务器执行此操作以避免依赖同步时钟)。此时间戳存储在Android设备上,并在请求新同步时使用。
  • 当服务器收到同步请求时,存储的上次同步时间戳再次从设备传递给服务器。现在,一个简单的查询可以提取自时间戳以来的所有相关添加数据(减去一些常量以确保您获得所有内容)。例如SELECT * FROM Mydata WHERE(time_changed&gt;(last_sync-5000)); 5000秒5秒。
  • 现在,当您从服务器接收数据时,请记住添加 [server_id] ,这只是来自服务器的自动增量_id。这使您可以推断出某些已接收的行是否已知(可能在上面减去5秒)。
  • 扣除是设备上的一个简单查询,例如:我是否已经有 [server_id] 的行,如果没有我们添加它,如果是,则跳过它。

使用此方法可以避免随着时间的推移发送越来越多的信息,因为您只发送上次同步后更改的行(再多一点)。

如果您在服务器上修改行,只需再次更新 time_changed 即可反映编辑内容。然后,在下次同步时,它将自动包含在设备中并覆盖。

如果您打算在Android设备上进行大量的数据库操作,我建议尝试MotoDev,它可以插入到eclipse中并具有一些不错的数据库功能。包括数据库透视图和ContentProviders的自动生成(使数据库操作简单的好类)。

给出完整的解释或指导来做所有这些都超出了这个答案的范围。它应该只是让你知道如何完成它,如果你想改进你的同步过程,你现在有一些指导。

关于机制作为数据库的自动增量和时间戳,有很多例子可以在interwebz上找到。

快乐编码:)