【问题标题】:load data from sqlite is working fine in one fragment while not working in second fragment从 sqlite 加载数据在一个片段中工作正常,而在第二个片段中不工作
【发布时间】:2016-10-12 17:59:07
【问题描述】:

我在 mainActivity 中有 asynctask 并将该数据保存到 sqlite。但是当我在 viewpager 片段中加载该数据时,它工作正常,而第二个片段中没有任何事情发生。有人可以帮助我吗?

public class CurrentContests extends Fragment {

        private String TAG = CurrentContests.class.getSimpleName();

        RecyclerView rv;
        ProgressDialog pdialog;
        public DataAdapter adapter;
        protected static ArrayList<DataModel> data;
        private RecyclerView.LayoutManager layoutManager;
        static View v;
        private static final String SELECT_SQL = "SELECT * FROM ankit";
        public SQLiteDatabase db;
        private Cursor c;

        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {


            v = inflater.inflate(R.layout.currentcontests_layout, container, false);
            data = new ArrayList<>();
            rv = (RecyclerView) v.findViewById(R.id.tab1_recycler_view);
            rv.setHasFixedSize(true);
            layoutManager = new LinearLayoutManager(getActivity());
            rv.setLayoutManager(layoutManager);
            rv.setItemAnimator(new DefaultItemAnimator());
            adapter = new DataAdapter(data);
            rv.setAdapter(adapter);
           /* new GetContacts().execute();*/
            openDatabase();


            c = db.rawQuery(SELECT_SQL, null);
            //c.moveToFirst();
            //showRecords();
            db.beginTransaction();
            shownow();
            return v;
        }

        protected void openDatabase() {
            db =getActivity().openOrCreateDatabase("ankitDB", Context.MODE_PRIVATE, null);//openOrCreateDatabase("ankitDB", Context.MODE_PRIVATE, null);
        }
        private void shownow(){
            //if the cursor isnt null we will essentially iterate over rows and then columns
            //to form a table of data as per database.
            if (c != null) {

                //more to the first row
                c.moveToFirst();
                Log.e("current", "shownow");
                //iterate over rows
                for (int i = 0; i < c.getCount(); i++) {

                    String site = c.getString(1);
                    String name = c.getString(2);
                    String begin_date = c.getString(3);
                    String begin_time=c.getString(4);
                    String end_date=c.getString(5);
                    String end_time=c.getString(6);
                    String type=c.getString(7);
                    //String type=c.getString(8);

                        DataModel dm = new DataModel(site, name, begin_date, begin_time, end_date, end_time);//,i+1,R.drawable.codechef);
                        data.add(dm);


                    //move to the next row
                    c.moveToNext();
                }
                //close the cursor
                db.setTransactionSuccessful();
               db.endTransaction();
                c.close();
                db.close();
            }
            adapter.notifyDataSetChanged();
        }
    }

这是我的第二个片段

public class SecondContent extends Fragment {

        private String TAG = UpcommingContests.class.getSimpleName();
        RecyclerView rv;
        ProgressDialog pdialog;
        public DataAdapter adapter;
        protected static ArrayList<DataModel> data;
        private RecyclerView.LayoutManager layoutManager;
        static View v;

        private static final String SELECT_SQL = "SELECT * FROM ankit";

        public SQLiteDatabase dbup;

        private Cursor cup;
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {


            v = inflater.inflate(R.layout.upcomingcontests_layout, container, false);
            data = new ArrayList<>();
            rv = (RecyclerView) v.findViewById(R.id.rv_tab2);
            rv.setHasFixedSize(true);
            layoutManager = new LinearLayoutManager(getActivity());
            rv.setLayoutManager(layoutManager);
            rv.setItemAnimator(new DefaultItemAnimator());
            adapter = new DataAdapter(data);
            rv.setAdapter(adapter);
           /* new GetContacts().execute();*/
            openDatabase();
            cup = dbup.rawQuery(SELECT_SQL, null);
            //c.moveToFirst();
            //showRecords();
            shownow();
            return v;
        }
        protected void openDatabase() {
            dbup =getActivity().openOrCreateDatabase("ankitDB", Context.MODE_PRIVATE, null);//openOrCreateDatabase("ankitDB", Context.MODE_PRIVATE, null);
        }
        private void shownow(){
            //if the cursor isnt null we will essentially iterate over rows and then columns
            //to form a table of data as per database.
            if (cup != null) {
                //more to the first row
                cup.moveToFirst();
                Log.e("upcoming","shownow");
                //iterate over rows
                for (int i = 0; i < cup.getCount(); i++) {
                    String site = cup.getString(1);
                    String name = cup.getString(2);
                    String begin_date = cup.getString(3);
                    String begin_time=cup.getString(4);
                    String end_date=cup.getString(5);
                    String end_time=cup.getString(6);
                    String type=cup.getString(7);
                    //String type=c.getString(8);
                    Log.e("upcoming",site+"");
                        DataModel dm = new DataModel(site, name, begin_date, begin_time, end_date, end_time);//,i+1,R.drawable.codechef);
                        data.add(dm);
                    //move to the next row
                    cup.moveToNext();
                }
                //close the cursor
                adapter.notifyDataSetChanged();
                cup.close();
                dbup.close();

            }
            adapter.notifyDataSetChanged();
        }
    }

【问题讨论】:

  • 请帮帮我@Raunak
  • 你能发布你的第二个片段的代码吗?
  • 请先检查您的光标是否为空?

标签: android sqlite android-fragments android-asynctask android-viewpager


【解决方案1】:

问题可能出在数据库事务管理中。当事务开始时,它会阻止从任何其他地方对数据库的访问,直到它结束。

在您的情况下,您在onCreateView() 开始事务,并且仅当光标不为空时才完成它。这意味着如果您的光标为空,数据库将保持阻塞状态。

更喜欢在 try-finally 块中使用数据库事务来防止此类行为:

    db.beginTransaction();
try {
    // do your work
    db.setTransactionSuccessful();
} catch {
    //Error between database transaction. Or skip catch if not necessary 
} finally {
    db.endTransaction();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多