GVKun编程网logo

java – 以两种方式在Android sqlite和sql server(crud操作)中同步

6

如果您想了解java–以两种方式在Androidsqlite和sqlserver(crud操作)中同步的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析androidSQLite使用SQLite

如果您想了解java – 以两种方式在Android sqlite和sql server(crud操作)中同步的知识,那么本篇文章将是您的不二之选。同时我们将深入剖析android SQLite 使用 SQLiteOpenHelper 类对数据库进行操作、Android Studio:android.database.sqlite.SQLiteException:无此类列:正在准备(代码1):、Android – 将SQLite与MySQL同步的最佳方式、android – 带有SQlite和ContentProvider操作的RxJava的各个方面,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

java – 以两种方式在Android sqlite和sql server(crud操作)中同步

java – 以两种方式在Android sqlite和sql server(crud操作)中同步

我正在开发一个具有的Android应用程序

> sq lite db在我的设备上
>服务器sql db在主服务器上同步它们,两个相同
(相同的字段结构和字段名称)
>我需要以两种方式在这些数据库之间开发同步
>如果我在Android中更改数据库数据,那么它将更改Web服务器上的数据
>当我从服务器更改数据时,它应该更改android中的数据
>同步将自动在1天内运行

现在的问题是如何在Android中同步这些数据库?
因为我刚刚进入移动世界,我也是internee,他们说,如果我将完成这项工作,那么我将永久.

发现了几件事,但我在初学者水平.
我找不到任何样品.我在这里发现了类似的问题,但没有找到任何代码,任何只在2路上同步数据的样本.

如果有人会给我(开源项目)或一些带有一些解释的示例代码,我将不胜感激.

或类似的东西,将告诉我一个方法来做到这一点.

How to sync SQLite database on Android phone with MySQL database on server?

Android bi-directional sqlite database synchronization

我找到了这些文章,但没有帮助我.

解决方法:

使用此作为您的Android服务

public class Connector {

HttpClient httpClient = null;
HttpPost httpPost = null;
HttpResponse httpResponse = null;
String serverResponse = null;

public String callService(String url){

    try{
        httpClient = new DefaultHttpClient();
        httpPost = new HttpPost(url);
        httpResponse = httpClient.execute(httpPost);
        //Log.e("URL Response", serverResponse);
        serverResponse = EntityUtils.toString(httpResponse.getEntity());
    }
    catch(Exception ex){
        Log.e("Exception in connectivity", ex.toString());
    }
    //Log.e("URL Response", serverResponse);
    return serverResponse;
}

}

这个类可以帮助你更新android db

public class DbSync extends sqliteOpenHelper {

private static String DB_PATH = "";
private static final String DATABASE_NAME = "Your_Db_Name";
private sqliteDatabase sqliteDb = null;
private String path = null;

public DbSync(Context context) {
    super(context, DATABASE_NAME, null, 1);
    DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    path = DB_PATH + DATABASE_NAME;
}

@Override
public void onCreate(sqliteDatabase db) {

}

@Override
public void onUpgrade(sqliteDatabase db, int oldVersion, int newVersion) {

}

public void syncUsers(){
    try {
        String response = new TaskAsync().execute("URL_Where_Service_Running").get();
        Log.d("response", response);

        String tableName = "Table_Name";

        sqliteDb = sqliteDatabase.openDatabase(path, null,  sqliteDatabase.OPEN_READWRITE);
        sqliteDb.delete(tableName, null, null);

                    //here you have to parse your data from DB and insert using 
                    ContentValues values = new ContentValues();
        values.put("col_name1", parsedColumnValue);
        values.put("col_name2", parsedColumnValue);

        long status = sqliteDb.insert(tableName, " ", values);

        Log.d("database", Long.toString(status));


        sqliteDb.close();

    } catch (Exception e) {
        e.printstacktrace();
    }
}

您必须根据从DB返回的数据定制上述代码.
希望能帮助到你:)

android SQLite 使用 SQLiteOpenHelper 类对数据库进行操作

android SQLite 使用 SQLiteOpenHelper 类对数据库进行操作

一、 SQLite 介绍
SQLite 是 android 内置的一个很小的关系型数据库。
SQLite 的官网是 http://www.sqlite.org/,可以去下载一些文档或相关信息。
博客中有一篇有稍微详细一点的介绍,大家可以去看一下。

二、 SQLiteOpenHelper 的使用方法
SQLiteOpenHelper 是一个辅助类来管理数据库的创建和版本。
可以通过继承这个类,实现它的一些方法来对数据库进行一些操作。
所有继承了这个类的类都必须实现下面这样的一个构造方法:
public DatabaseHelper(Context context, String name, CursorFactory factory, int version)
第一个参数:Context 类型,上下文对象。
第二个参数:String 类型,数据库的名称
第三个参数:CursorFactory 类型
第四个参数:int 类型,数据库版本
下面是这个类的几个方法:

方法名 返回类型 描述 备注
getReadableDatabase () synchronized SQLiteDatabase 创建或打开一个数据库 可以通过这两个方法返回的 SQLiteDatabase 对象对数据库进行一系列的操作,如新建一个表,插入一条数据等
getWritableDatabase () synchronized SQLiteDatabase 创建或打开一个可以读写的数据库
onCreate (SQLiteDatabase db) abstract void 第一次创建的时候调用
onOpen (SQLiteDatabase db) void 打开数据库
onUpgrade (SQLiteDatabase db,int oldVersion,int newVersion) abstract void 升级数据库
close () synchronized void 关闭所有打开的数据库对象

下面有一个例子,当点击按钮时进行相应的操作,效果图如下:


介于代码中有详细备注了,在此我就不多写了,直接贴代码了,代码如下:
DatabaseHelper 类:
Java 代码   收藏代码
  1. package android.sqlite;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteOpenHelper;  
  6. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  7.   
  8. /** 
  9.  * SQLiteOpenHelper 是一个辅助类,用来管理数据库的创建和版本他,它提供两个方面的功能 
  10.  * 第一,getReadableDatabase ()、getWritableDatabase () 可以获得 SQLiteDatabase 对象,通过该对象可以对数据库进行操作 
  11.  * 第二,提供了 onCreate ()、onUpgrade () 两个回调函数,允许我们再创建和升级数据库时,进行自己的操作 
  12.  */  
  13. public class DatabaseHelper extends SQLiteOpenHelper {  
  14.     private static final int VERSION = 1;  
  15.   
  16.     /** 
  17.      * 在 SQLiteOpenHelper 的子类当中,必须有该构造函数 
  18.      * @param context   上下文对象 
  19.      * @param name      数据库名称 
  20.      * @param factory 
  21.      * @param version   当前数据库的版本,值必须是整数并且是递增的状态 
  22.      */  
  23.     public DatabaseHelper(Context context, String name, CursorFactory factory,  
  24.             int version) {  
  25.         // 必须通过 super 调用父类当中的构造函数  
  26.         super(context, name, factory, version);  
  27.     }  
  28.       
  29.     public DatabaseHelper(Context context, String name, int version){  
  30.         this(context,name,null,version);  
  31.     }  
  32.   
  33.     public DatabaseHelper(Context context, String name){  
  34.         this(context,name,VERSION);  
  35.     }  
  36.   
  37.     // 该函数是在第一次创建的时候执行,实际上是第一次得到 SQLiteDatabase 对象的时候才会调用这个方法  
  38.     @Override  
  39.     public void onCreate(SQLiteDatabase db) {  
  40.         // TODO Auto-generated method stub  
  41.         System.out.println("create a database");  
  42.         //execSQL 用于执行 SQL 语句  
  43.         db.execSQL("create table user(id int,name varchar(20))");  
  44.     }  
  45.   
  46.     @Override  
  47.     public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {  
  48.         // TODO Auto-generated method stub  
  49.         System.out.println("upgrade a database");  
  50.     }  
  51. }  


Activity 类:
Java 代码   收藏代码
  1. package android.sqlite;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ContentValues;  
  5. import android.database.Cursor;  
  6. import android.database.sqlite.SQLiteDatabase;  
  7. import android.os.Bundle;  
  8. import android.view.View;  
  9. import android.view.View.OnClickListener;  
  10. import android.widget.Button;  
  11.   
  12. public class SQLiteActivity extends Activity {  
  13.     /** Called when the activity is first created. */  
  14.     private Button createDatabaseButton = null;  
  15.     private Button updateDatabaseButton = null;  
  16.     private Button insertButton = null;  
  17.     private Button updateButton = null;  
  18.     private Button selectButton = null;  
  19.     private Button deleteButton = null;  
  20.   
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.main);  
  25.         // 根据控件 id 获得相应的控件对象  
  26.         createDatabaseButton = (Button) findViewById(R.id.createDatabase);  
  27.         updateDatabaseButton = (Button) findViewById(R.id.updateDatabase);  
  28.         insertButton = (Button) findViewById(R.id.insert);  
  29.         updateButton = (Button) findViewById(R.id.update);  
  30.         selectButton = (Button) findViewById(R.id.select);  
  31.         deleteButton = (Button) findViewById(R.id.delete);  
  32.         // 为按钮设置监听器  
  33.         createDatabaseButton  
  34.                 .setOnClickListener(new CreateDatabaseOnClickListener());  
  35.         updateDatabaseButton  
  36.                 .setOnClickListener(new UpdateDatabaseOnClickListener());  
  37.         insertButton.setOnClickListener(new InsertOnClickListener());  
  38.         updateButton.setOnClickListener(new UpdateOnClickListener());  
  39.         selectButton.setOnClickListener(new SelectOnClickListener());  
  40.         deleteButton.setOnClickListener(new DeleteOnClickListener());  
  41.     }  
  42.   
  43.     // createDatabaseButton 点击事件监听器  
  44.     class CreateDatabaseOnClickListener implements OnClickListener {  
  45.         public void onClick(View v) {  
  46.             // 创建了一个 DatabaseHelper 对象,只执行这句话是不会创建或打开连接的  
  47.             DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,  
  48.                     "test_yangyz_db");  
  49.             // 只有调用了 DatabaseHelper 的 getWritableDatabase () 方法或者 getReadableDatabase () 方法之后,才会创建或打开一个连接  
  50.             SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();  
  51.         }  
  52.     }  
  53.   
  54.     // updateDatabaseButton 点击事件监听器  
  55.     class UpdateDatabaseOnClickListener implements OnClickListener {  
  56.         public void onClick(View v) {  
  57.             // TODO Auto-generated method stub  
  58.             DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,  
  59.                     "test_yangyz_db"2);  
  60.             // 得到一个只读的 SQLiteDatabase 对象  
  61.             SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();  
  62.         }  
  63.   
  64.     }  
  65.   
  66.     // insertButton 点击事件监听器  
  67.     class InsertOnClickListener implements OnClickListener {  
  68.         public void onClick(View v) {  
  69.             // 创建 ContentValues 对象  
  70.             ContentValues values = new ContentValues();  
  71.             // 向该对象中插入键值对,其中键是列名,值是希望插入到这一列的值,值必须和数据库当中的数据类型一致  
  72.             values.put("id"1);  
  73.             values.put("name""yangyz");  
  74.             // 创建 DatabaseHelper 对象  
  75.             DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,  
  76.                     "test_yangyz_db"2);  
  77.             // 得到一个可写的 SQLiteDatabase 对象  
  78.             SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();  
  79.             // 调用 insert 方法,就可以将数据插入到数据库当中  
  80.             // 第一个参数:表名称  
  81.             // 第二个参数:SQl 不允许一个空列,如果 ContentValues 是空的,那么这一列被明确的指明为 NULL 值  
  82.             // 第三个参数:ContentValues 对象  
  83.             sqliteDatabase.insert("user"null, values);  
  84.         }  
  85.     }  
  86.   
  87.     // updateButton 点击事件监听器  
  88.     class UpdateOnClickListener implements OnClickListener {  
  89.         public void onClick(View v) {  
  90.             // 创建一个 DatabaseHelper 对象  
  91.             DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,  
  92.                     "test_yangyz_db"2);  
  93.             // 得到一个可写的 SQLiteDatabase 对象  
  94.             SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();  
  95.             // 创建一个 ContentValues 对象  
  96.             ContentValues values = new ContentValues();  
  97.             values.put("name""zhangsan");  
  98.             // 调用 update 方法  
  99.             // 第一个参数 String:表名  
  100.             // 第二个参数 ContentValues:ContentValues 对象  
  101.             // 第三个参数 String:where 字句,相当于 sql 语句 where 后面的语句,?号是占位符  
  102.             // 第四个参数 String []:占位符的值  
  103.             sqliteDatabase.update("user", values, "id=?"new String[] { "1" });  
  104.             System.out.println("-----------update------------");  
  105.         }  
  106.     }  
  107.   
  108.     // selectButton 点击事件监听器  
  109.     class SelectOnClickListener implements OnClickListener {  
  110.         public void onClick(View v) {  
  111.             String id = null;  
  112.             String name = null;  
  113.             // 创建 DatabaseHelper 对象  
  114.             DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,  
  115.                     "test_yangyz_db"2);  
  116.             // 得到一个只读的 SQLiteDatabase 对象  
  117.             SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase();  
  118.             // 调用 SQLiteDatabase 对象的 query 方法进行查询,返回一个 Cursor 对象:由数据库查询返回的结果集对象  
  119.             // 第一个参数 String:表名  
  120.             // 第二个参数 String []: 要查询的列名  
  121.             // 第三个参数 String:查询条件  
  122.             // 第四个参数 String []:查询条件的参数  
  123.             // 第五个参数 String: 对查询的结果进行分组  
  124.             // 第六个参数 String:对分组的结果进行限制  
  125.             // 第七个参数 String:对查询的结果进行排序  
  126.             Cursor cursor = sqliteDatabase.query("user"new String[] { "id",  
  127.                     "name" }, "id=?"new String[] { "1" }, nullnullnull);  
  128.             // 将光标移动到下一行,从而判断该结果集是否还有下一条数据,如果有则返回 true,没有则返回 false  
  129.             while (cursor.moveToNext()) {  
  130.                 id = cursor.getString(cursor.getColumnIndex("id"));  
  131.                 name = cursor.getString(cursor.getColumnIndex("name"));  
  132.             }  
  133.             System.out.println("-------------select------------");  
  134.             System.out.println("id: "+id);  
  135.             System.out.println("name: "+name);  
  136.         }  
  137.     }  
  138.   
  139.     // deleteButton 点击事件监听器  
  140.     class DeleteOnClickListener implements OnClickListener {  
  141.         public void onClick(View v) {  
  142.             // 创建 DatabaseHelper 对象  
  143.             DatabaseHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_yangyz_db",2);  
  144.             // 获得可写的 SQLiteDatabase 对象  
  145.             SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase();  
  146.             // 调用 SQLiteDatabase 对象的 delete 方法进行删除操作  
  147.             // 第一个参数 String:表名  
  148.             // 第二个参数 String:条件语句  
  149.             // 第三个参数 String []:条件值  
  150.             sqliteDatabase.delete("user""id=?"new String[]{"1"});  
  151.             System.out.println("----------delete----------");  
  152.         }  
  153.     }  
  154. }  


布局文件:
Xml 代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <TextView    
  8.     android:layout_width="fill_parent"   
  9.     android:layout_height="wrap_content"   
  10.     android:text="@string/hello"  
  11.     />  
  12.       
  13.     <Button  
  14.         android:id="@+id/createDatabase"  
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="wrap_content"  
  17.         android:text="@string/createDatabaseButton"  
  18.     />  
  19.       
  20.     <Button  
  21.         android:id="@+id/updateDatabase"  
  22.         android:layout_width="fill_parent"  
  23.         android:layout_height="wrap_content"  
  24.         android:text="@string/updateDatabaseButton"  
  25.     />  
  26.       
  27.     <Button  
  28.         android:id="@+id/insert"  
  29.         android:layout_width="fill_parent"  
  30.         android:layout_height="wrap_content"  
  31.         android:text="@string/insertButton"  
  32.     />  
  33.       
  34.     <Button  
  35.         android:id="@+id/update"  
  36.         android:layout_width="fill_parent"  
  37.         android:layout_height="wrap_content"  
  38.         android:text="@string/updateButton"  
  39.     />  
  40.       
  41.     <Button  
  42.         android:id="@+id/select"  
  43.         android:layout_width="fill_parent"  
  44.         android:layout_height="wrap_content"  
  45.         android:text="@string/selectButton"  
  46.     />  
  47.       
  48.     <Button  
  49.         android:id="@+id/delete"  
  50.         android:layout_width="fill_parent"  
  51.         android:layout_height="wrap_content"  
  52.         android:text="@string/deleteButton"  
  53.     />  
  54. </LinearLayout>  


String 文件:
Xml 代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string name="hello">Hello World, SQLiteActivity!</string>  
  4.     <string name="app_name">SQLiteTest</string>  
  5.     <string name="createDatabaseButton">createDatabase</string>  
  6.     <string name="updateDatabaseButton">updateDatabase</string>  
  7.     <string name="insertButton">insert</string>  
  8.     <string name="updateButton">update</string>  
  9.     <string name="selectButton">select</string>  
  10.     <string name="deleteButton">delete</string>  
  11. </resources>  

Android Studio:android.database.sqlite.SQLiteException:无此类列:正在准备(代码1):

Android Studio:android.database.sqlite.SQLiteException:无此类列:正在准备(代码1):

如何解决Android Studio:android.database.sqlite.SQLiteException:无此类列:正在准备(代码1):?

我必须根据状态获取数据,并将其放入适当的Recycler View。我尝试说的任何内容都没有列或存在无法识别的标记。老实说,我不知道出什么问题了,请帮助! 订单合同 `public ArrayList getorderListByStatus(long vendorId,String status){ 打开(); ArrayListordersList = new ArrayList();

    Cursor cursor = mDb.query(OrdersEntry.TABLE_NAME,mAllColumns,OrdersEntry.COL_vendOR_ID + " =? AND " + OrdersEntry.COL_STATUS + "=" + status,new String[]{String.valueOf(vendorId)},null,null);

    if (cursor != null) {
        cursor.movetoFirst();
        while (!cursor.isAfterLast()) {
            Order order = cursorToOrder(cursor,cursor.getLong(cursor.getColumnIndex(OrdersEntry.COL_CUSTOMER_ID)),vendorId);
            ordersList.add(order);
            if (cursor.isLast() || cursor.isClosed())
                break;
            else
                cursor.movetoNext();
        }
    }
    cursor.close();
    mDb.close();
    close();
    return ordersList;
}

OrdersFragment

public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_orders,container,false);


    sharedPref = getActivity().getSharedPreferences("KeyData",Context.MODE_PRIVATE);

    //first recycler
    pendingRecyclerView = v.findViewById(R.id.pendingRecycler);
    pendingRecyclerView.setHasFixedSize(true);
    mLayoutManager = new linearlayoutmanager(getContext()); //use linear layout on cards
    pendingRecyclerView.setLayoutManager(mLayoutManager);
    pendingOrderAdapter = new OrderAdapter(getContext(),this);
    pendingOrderAdapter.submitList(getorderList("Preparing"));
    recyclerAdapter = pendingOrderAdapter;//specify adapter and pass in item list
    pendingRecyclerView.setAdapter(recyclerAdapter);

    //second recycler
    completedRecyclerView = v.findViewById(R.id.completedRecycler);
    completedRecyclerView.setHasFixedSize(true);
    mLayoutManager2 = new linearlayoutmanager(getContext());
    completedRecyclerView.setLayoutManager(mLayoutManager2);
    CompletedOrderAdapter = new OrderAdapter(getContext(),this);
    CompletedOrderAdapter.submitList(getorderList("Completed"));
    recyclerAdapter2 = CompletedOrderAdapter;
    completedRecyclerView.setAdapter(recyclerAdapter2);


    return v;
}
//need two arrayList,orderPending and orderComplete
//get order list from order database
public ArrayList<Order> getorderList(String status) {

    String email = sharedPref.getString("Email","");

    vendorsContract vc = new vendorsContract(getContext());
    OrdersContract oc = new OrdersContract(getContext());

    vendor vendor = vc.getvendorIdByEmail(email);
    Order order = oc.getorderById(vendor.getM_Id());
    order.getM_Status();
   switch (status)
   {
       case "Preparing":
           pendingOrderList = oc.getorderListByStatus(vendor.getM_Id(),status);
           return pendingOrderList;
       case "Completed":
           completedOrderList = oc.getorderListByStatus(vendor.getM_Id(),status);
           return completedOrderList;
   }
   return null;
}

Error Message

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Android – 将SQLite与MySQL同步的最佳方式

Android – 将SQLite与MySQL同步的最佳方式

参见英文答案 > Synchronizing client-server databases5个
我正在开发一个包含网络应用和移动应用程序的项目,该应用程序记录每日用户的数据.用户可以删除,更新他们的数据,他们可以使用许多设备插入数据.
我打算这样开发:
用户输入他们的数据然后插入sqlite.服务将定期启动(每5小时或每小时)以使用时间戳与MysqL同步.
我确实在互联网上使用服务和时间戳搜索了一个样本,但我一无所获.如果有样本或教程会很棒.
我是Android的新手,我不知道开发这样的应用程序的最佳方式是什么.提前致谢.

– – 编辑 – –
我考虑使用时间戳或同步.哪个更有效?

解决方法

您可以通过谷歌或任何其他库使用volley库,这取决于您希望如何发送数据,最好的方法是使用JSON让您的生活更轻松,从您希望与后端同步的sqlite中获取数据并使用volley通过JsonObjectRequest发送它,例如您的请求可能如下所示
jsonObjectRequest postForm = new JsonObjectRequest(Request.Method.POST,URL,YourjsonData,new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
         // here you can get your response.
        },new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
    // here you can tell there is something went wrong.
    });

你可以添加一个新值,指示该值是否已同步或来自本地数据库.例如,假设您有一个名为student的表,并且当您的响应返回成功时,此表有三列ID,NAME并在上面的代码中同步更新行同步列为true | false,表示此行是否与您的后端同步或没有.要从数据库中获取数据,您应该执行以下操作.

public String getStudents() {
        List<Student> students = new ArrayList<Student>();
        String query = "SELECT  * FROM " + STUDENT+ "where synced=0";
        sqliteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query,null);
        if (cursor.movetoFirst()) {
            do {
                Student st = new Student();
                st.setId(cursor.getString(cursor.getColumnIndex(ID)));
                st.setName(cursor.getString(cursor.getColumnIndex(NAME)));
                st.setSynced(cursor.getInt(cursor.getColumnIndex(SYNCED)));
                students.add(st);
            } while (cursor.movetoNext());
        }
        db.close();
        return new Gson().toJson(students);
    }

android – 带有SQlite和ContentProvider操作的RxJava

android – 带有SQlite和ContentProvider操作的RxJava

我正在研究Rx Java,为此我正在使用sqlite,编写一个辅助类sqliteUtils,以帮助更轻松地处理异步ContentResolver查询.
例如,这是queryInBackground方法:

static
public <T> Observable<T> queryInBackground(
        final ContentResolver cr,final Uri uri,final String[] projection,final String selection,final String[] selectionArgs,final String sortOrder,final CursorHandler<T> ch) {
    return  Observable.create(new Observable.OnSubscribe<T>() {
        @Override
        public void call(Subscriber<? super T> observer) {
            if (!observer.isUnsubscribed()) {
                Cursor cursor = null;
                try {
                    cursor = cr.query(uri,projection,selection,selectionArgs,sortOrder);
                    if (cursor != null && cursor.getCount() > 0) {
                        while (cursor.movetoNext()) {
                            observer.onNext(ch.handle(cursor));
                        }
                    }
                    observer.onCompleted();
                } catch (Exception err) {
                    observer.onError(err);

                } finally {
                    if (cursor != null) cursor.close();
                }
            }
        }
    }).subscribeOn(Schedulers.computation());
}

其中CursorHandler是一个接口:

/**
 * Implementations of this interface convert Cursor into other objects.
 *
 * @param <T> the target type the input Cursor will be converted to.
 */
public interface CursorHandler<T> {
    T handle(Cursor cu) throws sqlException;
}

我已经阅读了关于Schedulers的文档,但我不太确定Schedulers.computation()是否是正确的选择.

如果我想实现类似于基本HttpUrlConnection操作的东西,我应该选择哪个Scheduler? Schedulers.newThread()或Schedulers.io(),我坚持使用Schedulers.io()…但不确定.

提前致谢.

祝一切顺利,
卢卡

解决方法

根据 this answer,您应该使用Schedulers.io().相关报价:

io() is backed by an unbounded thread-pool and is the sort of thing you’d use for non-computationally intensive tasks,that is stuff that doesn’t put much load on the cpu. So yep interaction with the file system,interaction with databases or services on a different host are good examples.

关于java – 以两种方式在Android sqlite和sql server(crud操作)中同步的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于android SQLite 使用 SQLiteOpenHelper 类对数据库进行操作、Android Studio:android.database.sqlite.SQLiteException:无此类列:正在准备(代码1):、Android – 将SQLite与MySQL同步的最佳方式、android – 带有SQlite和ContentProvider操作的RxJava的相关信息,请在本站寻找。

本文标签: