代码之家  ›  专栏  ›  技术社区  ›  Rubick

在API上发送和保存SQLiteDatabase的最佳方法是什么?

  •  0
  • Rubick  · 技术社区  · 6 年前

    我是Android新手,正在开发一个大型应用程序,它向API发送数据并将其保存在SQlite上。所有这些过程都在一个类文件中。但这让我犯了个错误。有时设备会挂起来。另一种情况是数据不完整。我读过 Intent Service Services 我想了解这两者,但我想知道如何从UI获取所有数据并将其放到服务上。我能知道怎么做吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Leo    6 年前

    这取决于应用程序的性质。如果这是对用户输入的响应,那么您可以使用 AsyncTask . 否则,后台服务也可以完成这项工作。

    永远不要在主UI线程上运行网络操作和/或数据库访问。

    服务可以通过意图接收数据。发送这些意图的方式取决于服务的类型(启动、绑定或两者)。有很多资源可以阅读…这里有一个来自Android文档。。。

    https://developer.android.com/guide/components/services

    异步任务的示例

    下面的示例显示了 异步任务 从网络资源获取用户详细信息。。。

    public class FetchUserTask extends AsyncTask<String,Void, UserDTO> {
    
        private FetchUserTaskListener listener;
    
        @Override
        protected UserDTO doInBackground(String...params){
    
            if(params == null || params.length == 0)
                return null;
    
            String userID = params[0];
            UserDataProvider provider = new UserDataProvider(userID);
    
            try {
                return provider.get(userID);
            }
            catch(Exception ex){
                //log the error
                return null;
            }
        }
    
    
        @Override
        protected void onPostExecute(UserDTO user){
            if(listener != null)
                listener.onCompleted(user);
        }
    
        public void setListener(FetchUserTaskListener listener){
            this.listener = listener;
        }
    
        public interface FetchUserTaskListener{
            void onCompleted(boolean success);
        }
    } 
    

    你是怎么使用这个异步任务的?

    例如,在 Activity ,您将按如下方式使用它。。。

    public class UserDetailsActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            //instantiate activity...
            super.onCreate(savedInstanceState);
            setContentView(R.layout.whatever_layout);
    
            fetchUser(userId);
        }
    
        private void fetchUser(String userID){
            FetchUserTask task = new FetchUserTask();
            task.setListener(new FetchUserTaskListener<UserDTO>() {
                @Override
                public void onCompleted(UserDTO user) {
                    //CAUTION: make sure the activity hasn't been stopped before
                    //accessing any UI elements and/or context
                }
            }    
    
            task.execute(userID);
        }
    }
    

    注意

    你可以(也需要)让上面的例子更复杂一些。例如,您可以 FetchUserTaskListener onCompleted 方法在发生错误时还返回错误消息。

    在访问任何上下文绑定数据之前,还需要检查活动是否已暂停或停止,否则可能会出现ILlegalStateException。

        2
  •  0
  •   Krishna Satwaji Khandagale    6 年前

    使用SQLiteOpenHelper类,它有一些方法可以通过扩展SQLiteOpenHelper在您自己的类中重写。根据您在这个类中的需求创建Add、Update、Delete、Get方法,并将这个类保持为Singleton模式。用户异步任务调用那些methid,就完成了。

    希望这能帮助你更好地想象事物。