【问题标题】:What process is the best way to send on API and save SQLiteDatabase?在 API 上发送和保存 SQLiteDatabase 的最佳方式是什么?
【发布时间】:2018-08-06 02:35:17
【问题描述】:

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

【问题讨论】:

    标签: android sqlite service intentservice


    【解决方案1】:

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

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

    服务可以通过意图接收数据。发送这些意图的方式取决于服务的类型(已启动、已绑定或两者兼有)。您可以阅读大量资源...这是 Android 文档中的一个...

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

    AsyncTask 示例

    下面的示例显示了AsyncTask 的实现,它从网络资源中获取用户的详细信息...

    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);
        }
    } 
    

    你是如何使用这个 AsyncTask 的?

    例如,在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);
        }
    }
    

    注意

    您可以(并且将需要)使上面的示例更加复杂。例如,如果发生错误,您可以让FetchUserTaskListeneronCompleted 方法也返回错误消息。

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

    【讨论】:

    • 嗨,还阅读了有关AsyncTask 的信息,但我有一件事我不明白。里面的参数。 内的三种类型表示 eq。 “公共类 testAsync 扩展 Asynctask ,?,?>”
    【解决方案2】:

    利用 SQLiteOpenHelper 类,它具有通过扩展 SQLiteOpenHelper 在您自己的类中覆盖的方法。根据您在此类中的要求创建添加、更新、删除、获取方法,并将此类保持为单例模式。用户 Asynctasks 调用这些方法,你就完成了。

    希望能帮助您以更好的方式可视化事物。

    【讨论】:

    • 您好,目前我使用的是SQLiteOpenHelper,感谢您的建议:)
    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2017-07-30
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 2011-03-05
    相关资源
    最近更新 更多