【问题标题】:How to Send All SQLite Data to online Server如何将所有 SQLite 数据发送到在线服务器
【发布时间】:2014-05-22 04:19:21
【问题描述】:

我正在将数据存储到存储在 SD 卡中的 SQLiteDatabase,现在我必须将所有 SQLite 数据发送到服务器。 注意:我也为服务器数据库创建了相同的字段类似于到 SQLite DB)例如:PersonName

在我用来检查的代码下面,我是否能够将数据存储到服务器(出于测试目的 - 我将用户接受的数据放入edittext)然后 发送到服务器,我成功

String url = "http://localhost/ChurchData.php";                                         
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("sPersonName", editPersonName.getText().toString()));
String resultServer  = getHttpPost(url,params);
Log.d("Entire string::", " " + resultServer);

/*** Default Value ***/
strStatusID = "0";
strError = "";

JSONObject c;
try {
c = new JSONObject(resultServer);
strStatusID = c.getString("StatusID");
strError = c.getString("Message");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
 }
 // prepare save data
 if(strStatusID.equals("0"))
 {
Toast.makeText(getApplicationContext(), "Already Exist !", Toast.LENGTH_LONG).show();
 }
 else
 {
Toast.makeText(getApplicationContext(), "Data Uploaded Successfully!", Toast.LENGTH_SHORT).show();                          
 }
 return true;
}

private String getHttpPost(String url,
 List<NameValuePair> params) {
 StringBuilder str = new StringBuilder();
 HttpClient client = new DefaultHttpClient();
 HttpPost httpPost = new HttpPost(url);
 try {
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse response = client.execute(httpPost);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) { // Status OK
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
str.append(line);
}
} else {
Log.e("Log", "Failed to download result..");
}
} catch (ClientProtocolException e) {
    e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
 return str.toString();
}

所以我想知道,如何将 SQLite 数据库记录发送到服务器?我的数据库类如下所示:

public class myDBClasss extends SQLiteOpenHelper {

    // Database Version
    private static final int DATABASE_VERSION = 2;
    // Database Name
    private static final String DATABASE_NAME = "ChurchDB";
    // Table Name
    private static final String TABLE_MEMBER = "DataTable";

    public myDBClasss(Context context) {
        // to store data into SD Card   
       super(context, Environment.getExternalStorageDirectory()
                + File.separator + "ChurchData"
                + File.separator + DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        // Create Table Name
        db.execSQL("CREATE TABLE " + TABLE_MEMBER + 
                  "(PersonName VARCHAR(100)," +
                  " PersonEmail VARCHAR(100)," +
                  " PersonTelephone VARCHAR(100)," +
                  " Newsletter VARCHAR(100));");       // checkbox

        Log.d("CREATE TABLE","Create Table Successfully - classs");
    }

    // Insert Data
    public long insertData(String strPersonName, String strPersonEmail, String strPersonTelephone, String strNewsletter) {
        // TODO Auto-generated method stub

         try {
            SQLiteDatabase db;
            db = this.getWritableDatabase(); // Write Data

            ContentValues Val = new ContentValues(); 
            Val.put("PersonName", strPersonName);
            Val.put("PersonEmail", strPersonEmail);
            Val.put("PersonTelephone", strPersonTelephone);
            Val.put("Newsletter", strNewsletter);       // checkbox

            long rows = db.insert(TABLE_MEMBER, null, Val);

            db.close();
            return rows; // return rows inserted.

         } catch (Exception e) {
            return -1;
         }
    }

    // Update Data
    public long updateData(String strPersonName, String strPersonEmail, String strPersonTelephone, String strNewsletter){
    // TODO Auto-generated method stub

        try {
            SQLiteDatabase db;
            db = this.getWritableDatabase(); // Write Data

            ContentValues Val = new ContentValues();
            Val.put("PersonName", strPersonName);
            Val.put("PersonEmail", strPersonEmail);
                    Val.put("PersonTelephone", strPersonTelephone);
            Val.put("Newsletter", strNewsletter);       // checkbox

            long rows = db.update(TABLE_MEMBER, Val, "PersonName=?",
                    new String[] { String.valueOf(strPersonName) });

            db.close();
            return rows; // return rows updated.

        } catch (Exception e) {
            return -1;
        }   
    }

    // Fetch data
    public String[] selectData(String strPersonName) {
        // TODO Auto-generated method stub

         try {
            String arrData[] = null;    

             SQLiteDatabase db;
             db = this.getReadableDatabase(); // Read Data

             Cursor cursor = db.query(TABLE_MEMBER, new String[] { "*" }, 
                        "PersonName=?",
                        new String[] { String.valueOf(strPersonName) }, null, null, null, null);

                if(cursor != null)
                {
                    if (cursor.moveToFirst()) {
                        arrData = new String[cursor.getColumnCount()];

                        arrData[0] = cursor.getString(0);
                        arrData[1] = cursor.getString(1);
                        arrData[2] = cursor.getString(2);
                        arrData[3] = cursor.getString(3);       // checkbox
                    }
                }
                cursor.close();
                db.close();
                return arrData;

         } catch (Exception e) {
            return null;
         }
    }

    // Check for data(s) using PersonName field
    public boolean exists(String strImageName) {
           SQLiteDatabase db;
           db = this.getReadableDatabase(); // Read Data
           Cursor cursor = db.rawQuery("select 1 from DataTable where PersonName= ?", 
                new String[] { strImageName });
           boolean exists = (cursor.getCount() > 0);
           cursor.close();
           return exists;
    }


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

}

【问题讨论】:

    标签: android sqlite


    【解决方案1】:

    我认为简单的方法是将所有 sqlite 数据转换为 xml 或 json,然后只需一个 http 请求即可将所有数据发送到在线服务器。在在线服务器上,您可以轻松解析数据,因为您已经知道您使用的 xml 或 json 的结构。

    假设您的数据库中有 2 个字段。身份证,姓名。你有 10 条记录。您将所有记录转换为 json 。

    假设您在数据库中查询所有记录,现在cursor 对象将保存您所有的 sqlite 数据。

    添加getAllData() 方法来检索您的所有数据库数据。

    public Cursor getAllData() {
         String selectQuery = "Select * from "+TABLE_MEMBER; 
         SQLiteDatabase db = this.getReadableDatabase();
         Cursor cursor = db.rawQuery(selectQuery, null);
         return cursor;
    }
    

    现在做,

    Cursor cursor = getAllData();  //cursor hold all your data
    JSONObject jobj ;
    JSONArray arr = new JSONArray();
    cursor.moveToFIrst();
    while(cursor.moveToNext()) {
       jobj = new JSONObject();
       jboj.put("Id", cursor.getInt("Id"));
       jboj.put("Name", cursor.getString("Name"));
       arr.put(jobj);
    }
    
    jobj = new JSONObject();
    jobj.put("data", arr);
    
    String st = jboj.toString();
    

    现在只需使用字符串参数进行 http 调用并发送到服务器。然后通过将此字符串转换为 jsonobject 在服务器上进行解析。

    现在根据你的代码,做

    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("allData", st));
    String resultServer  = getHttpPost(url,params);
    

    【讨论】:

    • 谢谢,请检查我上面发布的代码,让我知道我必须在哪里进行更改!
    • 用我添加的那个替换你的http请求coe。
    • 您是否会在代码中清除将我的数据库记录转换为 JSON 的位置(因为我猜您没有在代码中的任何地方使用我的数据库名称)
    • 我使用了游标对象。 cursor 对象将保存您的所有数据。
    • 是的,我看到你使用了 Cursor,但朋友,你没有在代码中的任何地方使用我的数据库名称
    【解决方案2】:

    我有一些 sn-p 代码只是为了你的想法。如果它对你有帮助,我很高兴。

               protected void startSync(Context aContext) {
        try {
            AccountManager am = AccountManager.get(getBaseContext());
            Account[] ac = am.getAccountsByType(Constants.ACCOUNT_TYPE);
            if (ac.length > 0) {
                Toast.makeText(SuperHomeActivity.this,
                        "Synchronization Started", Toast.LENGTH_SHORT).show();
                List<PeriodicSync> aList = ContentResolver.getPeriodicSyncs(
                        ac[0], Constants.AUTHORITY);
                Bundle bundle = new Bundle();
                bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
                if (aList != null && aList.size() > 0) {
                    while (aList != null && !aList.isEmpty()) {
                        ContentResolver.removePeriodicSync(ac[0],
                                Constants.AUTHORITY, aList.get(0).extras);
                        aList.remove(0);
                    }
                }
                // mention only in seconds -> 120 minutes 60 seconds
                ContentResolver.addPeriodicSync(ac[0], Constants.AUTHORITY,
                        bundle, 5 * 60); //15
                ContentResolver.requestSync(ac[0], Constants.AUTHORITY, bundle);
            }
        } catch (Exception ex) {
            Log.e("SyncAccountTriggerError", ex.getMessage());
        }
    }
    

    你可以调用它

                    startSync(getApplicationContext());
    

    如需更多说明,请联系我。

    【讨论】:

    • 但在我的情况下,数据存储在 SD 卡中创建的 SQLite 数据库中,所以我如何从 SQLite 获取所有记录并将其发送到服务器
    • 另一件事是您发送整个数据库或数据库的内容?
    【解决方案3】:

    您可以使用 Http Post 方法或 Get 方法,或者如果您直接想要更新您的服务器数据库,则使用 Put 方法。您可以通过带有 NameValue 对的 http 请求发送数据,然后从服务器获取该数据并更新您的数据库。就是这样。

    【讨论】:

    • 我建议你再次阅读我的问题,我已经提到了已经存储到 sqlite 的数据,现在需要将所有 sqlite 数据发送到服务器,如果你会看到我在上面发布的代码,我也是使用 NameValue 对使用 post 方法将数据发送到服务器
    • 你为什么问这个问题?如果一切正常,亲爱的?
    • 您的数据库是在 SD 卡中创建的还是导出到那里?
    • @pratik 就像我写的一样,你应该在回答或评论之前先阅读我的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多