Разбор XML-вставки в базу данных SQLite и отображение данных во фрагменте - PullRequest
0 голосов
/ 08 января 2019

Я проанализировал xml, который работает, но теперь я хочу сохранить данные в SQLite db, потому что это локально для каждого телефона. Я хочу вставить эти данные xml в дБ, а затем загрузить данные из дБ. Я не знаю, как создать базу данных SQLite, которая будет извлекать данные, и я могу сохранить там новую запись.

Это мой код Bookmark.class.

Bookmark.class

public class Bookmark {
    String name, id, nativeUrl, searchUrl;
    int icon;
    int viewType;


    public String getName() { return name; }
    public void setName(String name) {
        this.name = name;
    }

    public int getIcon() { return icon; }
    public void setIcon(int icon) {
        this.icon = icon;
    }

    public String getId(){
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getNativeUrl() {
        return nativeUrl;
    }

    public void setNativeUrl(String nativeUrl) {
        this.nativeUrl = nativeUrl;
    }

    public String getSearchUrl() {
        return searchUrl;
    }

    public void setSearchUrl(String searchUrl) {
        this.searchUrl = searchUrl;
    }
    public int getViewType() {
        return viewType;
    }

    public void setViewType(int viewType) {
        this.viewType = viewType;
    }


    @Override
    public String toString() {
        return "Bookmark{" +
                "name='" + name + '\'' +
                ", icon='" + icon + '\'' +
                ", id='" + id + '\'' +
                ", nativeUrl='" + nativeUrl + '\'' +
                ", searchUrl='" + searchUrl + '\'' +
                '}';
    }

}

Это Adapter.class

Adapter.class

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private Context context;
    ArrayList<Bookmark> arrayList = new ArrayList<>();
    public static final int ITEM_TYPE_ONE = 0;
    public static final int ITEM_TYPE_TWO = 1;


    public MyAdapter(Context context, ArrayList<Bookmark> arrayList) {
        this.context = context;
        this.arrayList = arrayList;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = null;
        if (viewType == ITEM_TYPE_ONE) {
            view = LayoutInflater.from(context).inflate(R.layout.grid_item, parent, false);
            return new ViewHolder(view);
        } else if (viewType == ITEM_TYPE_TWO) {
            view = LayoutInflater.from(context).inflate(R.layout.add_bookmark, parent, false);
            return new ButtonViewHolder(view);
        }else {
            return  null;
        }

    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        final int itemType = getItemViewType(position);
        if (itemType == ITEM_TYPE_ONE) {
            final ViewHolder viewHolder = (ViewHolder) holder;
            viewHolder.tvName.setText(arrayList.get(position).getName());
            viewHolder.tvIcon.setImageResource(arrayList.get(position).getIcon());
       //     viewHolder.tvId.setText(arrayList.get(position).getId());
            viewHolder.tvSearchUrl.setText(arrayList.get(position).getSearchUrl());
            viewHolder.tvNativeUrl.setText(arrayList.get(position).getNativeUrl());

        } else if (itemType == ITEM_TYPE_TWO) {
            ButtonViewHolder buttonViewHolder = (ButtonViewHolder) holder;
            buttonViewHolder.imgButton.setImageResource(arrayList.get(position).getIcon());
        }


    }

    @Override
    public int getItemViewType(int position) {
        // based on you list you will return the ViewType 
        if (arrayList.get(position).getViewType() == 0) {
            return ITEM_TYPE_ONE;
        } else {
            return ITEM_TYPE_TWO;
        }
    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView tvName, tvId, tvSearchUrl, tvNativeUrl;

        ImageView tvIcon;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tvName = itemView.findViewById(R.id.textView);
            tvIcon = itemView.findViewById(R.id.image_view);
//            tvId = itemView.findViewById(R.id.tvId);
            tvSearchUrl = itemView.findViewById(R.id.tvSiteURL);
            tvNativeUrl = itemView.findViewById(R.id.tvNativeUrl);
            // tvName.setTextColor(Color.parseColor("#FFFFFF"));
    }
    }

    public class ButtonViewHolder extends RecyclerView.ViewHolder {


        ImageView imgButton;

        public ButtonViewHolder(@NonNull View itemView) {
            super(itemView);

            imgButton = itemView.findViewById(R.id.image_button_add);

            imgButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(context, ActivityChangeBookmark.class);
                    v.getContext().startActivity(intent);
                }
            });

        }
    }

Это Fragment.class, который я показываю разобранным xml.

Fragment.class

public class FragmentBookmark extends Fragment {
    ArrayList<Bookmark> arrayList = new ArrayList<>();
    MyAdapter myAdapter;
    View paramView;
    RecyclerView myRecyclerView;
    private Context mContext;
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
    }
    @Nullable
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
       paramView = inflater.inflate(R.layout.bookmark, container, false);
        myRecyclerView =  paramView.findViewById(R.id.myRecyclerView);
        // myRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
        myRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 4));
        myRecyclerView.setHasFixedSize(true);
        myAdapter = new MyAdapter(mContext, arrayList);
        myRecyclerView.setAdapter(myAdapter);
        try {
            XmlResourceParser xpp = getResources().getXml(R.xml.bookmarks);
            while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
                if (xpp.getEventType() == XmlPullParser.START_TAG) {
                    if (xpp.getName().equals("Bookmark")) {
                        Bookmark bookmark = new Bookmark();
                        bookmark.setName(xpp.getAttributeValue(null, "name"));
                        bookmark.setSearchUrl(xpp.getAttributeValue(null, "searchUrl"));
                        bookmark.setNativeUrl(xpp.getAttributeValue(null, "nativeUrl"));
                        int drawableResourceId = getResources().getIdentifier(xpp.getAttributeValue(null, "icon"),"drawable", mContext.getPackageName());
                        bookmark.setIcon(drawableResourceId);
                        bookmark.setViewType(0);
                        arrayList.add(bookmark);

                    }
                }
                xpp.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        myAdapter.notifyDataSetChanged();
        Bookmark bookmark = new Bookmark();
        bookmark.setViewType(1);
        bookmark.setIcon(R.drawable.add_new_bookmark_icon);
        arrayList.add(bookmark);
       return paramView;
    }
    }

Это .XML

<Bookmarks>
    <Bookmark name="Bing" hidden="" icon="bing" id="0" nativeUrl="" searchUrl="https://www.bing.com" />
    <Bookmark name="Google"  hidden="true" icon="google" id="1" nativeUrl="" searchUrl="https://www.google.com" />
    <Bookmark name="Youtube" hidden="" icon="youtube" id="2" nativeUrl="" searchUrl="http://m.youtube.com" />
    <Bookmark name="Facebook" hidden="" icon="facebook" id="3" nativeUrl="facebook://" searchUrl="https://m.facebook.com" />
    <Bookmark name="Twitter" hidden="" icon="twitter" id="4" nativeUrl="" searchUrl="https://mobile.twitte.com" />
    <Bookmark name="Instagram" hidden="" icon="instagram" id="5" nativeUrl="instagram://" searchUrl="https://instagram.com" />
    <Bookmark name="Gmail" hidden="" icon="gmail" id="6" nativeUrl="googlemail://" searchUrl="https://gmail.com" />
    <Bookmark name="Translate" hidden="" icon="google_translate" id="7" nativeUrl="" searchUrl="https://" />
    <Bookmark name="Amazon" hidden="" icon="amazon" id="8" nativeUrl="" searchUrl="https://www.amazon.com" />
    <Bookmark name="Wikipedia" hidden=""  icon="wiki" id="9"  searchUrl="http://en.m.wikipedia.org/w/index.php?title=Main_Page" />
    <Bookmark name="Weather" hidden="" icon="weathercom" id="10" searchUrl="http://weather.com" />
    <Bookmark name="eBay" hidden="" id="9" icon="ebay"  searchUrl="http://ebay.to/1VPVeAs" />
    <Bookmark name="Apple" id="10" icon="apple"  searchUrl="http://www.apple.com" hidden="true" />
</Bookmarks>

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Дополнительно - заставить его работать внутри фрагмента (вроде)

По комментариям

Я понимаю вас и заставил вас ответить как принятый, но вы этого не сделали напишите код, как показать сохраненные закладки в моем фрагменте. Во фрагменте покажи мне данные из разобранного xml и данные из sqlite.

Следующее на основе вашего кода загружает базу данных и заполняет массив для RecyclerView.

Bookmark.java соответствует вашему Bookmar.java, а не тому, который использовался ранее в вопросе.

BookmarkDBHelper.java используемый исправлен (главное изменение состоит в том, что getAllBookmarks был создан) сверху и имеет вид: -

public class BookmarkDBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "bookmarks.db"; // The name of the database file
    public static final int DBVERSION = 1;  // The Database version

    public static final String TBL_BOOKMARK = "bookmark";
    public static final String COL_ID = BaseColumns._ID; // equates to _id
    public static final String COl_NAME = "name";
    public static final String COl_HIDDEN = "hidden";
    public static final String COL_ICON = "icon";
    public static final String COL_NATIVEURL = "nativeurl";
    public static final String COL_SEARCHURL = "searchurl";

    SQLiteDatabase mDB;

    public BookmarkDBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        // Forces creation of the database (if it doesn't already exist)
        // and stores it when the BookmarkDBHelpr is instantiated
        mDB = this.getWritableDatabase();
    }

    /**
     * This creates the table(s) NOTE only automatically runs once
     */
    @Override
    public void onCreate(SQLiteDatabase db) {

        // The SQL to be used to create the table
        String crt_bookmark_tbl_sql = "CREATE TABLE IF NOT EXISTS " + TBL_BOOKMARK + "(" +
                COL_ID + " INTEGER PRIMARY KEY, " +
                COl_NAME + " TEXT, " +
                COl_HIDDEN + " INTEGER, " +
                COL_ICON + " TEXT, " +
                COL_NATIVEURL + " TEXT," +
                COL_SEARCHURL + " TEXT" +
                ")";
        db.execSQL(crt_bookmark_tbl_sql); // CREATE THE TABLE

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    /**
     * Adds a row
     */
    public long addBookMark(long id, String name, boolean hidden, String icon, String nativeurl, String searchurl) {
        ContentValues cv = new ContentValues();
        cv.put(COl_NAME,name);
        cv.put(COl_HIDDEN,hidden);
        cv.put(COL_ICON,icon);
        cv.put(COL_NATIVEURL,nativeurl);
        cv.put(COL_SEARCHURL,searchurl);
        // uses the convenience insert method that builds the SQL
        return mDB.insert(TBL_BOOKMARK,null,cv);
    }

    public ArrayList<Bookmark> getAllBookmarks() {
        ArrayList<Bookmark> rv  = new ArrayList<>();
        Cursor csr = mDB.query(TBL_BOOKMARK,null,null,null,null,null,null);
        while (csr.moveToNext()) {
            Bookmark b = new Bookmark();
            b.setId(csr.getString(csr.getColumnIndex(COL_ID)));
            b.setName(csr.getString(csr.getColumnIndex(COl_NAME)));
            b.setIcon(csr.getInt(csr.getColumnIndex(COL_ICON)));
            b.setViewType(csr.getInt(csr.getColumnIndex(COl_NAME)));
            b.setNativeUrl(csr.getString(csr.getColumnIndex(COL_NATIVEURL)));
            b.setSearchUrl(csr.getString(csr.getColumnIndex(COL_SEARCHURL)));
            rv.add(b);
        }
        return rv;
    }


    /**
     * Example of extracting data from the database
     */
    public void logAllBookmarkRows() {
        String hasval = " and has a value of ";
        String[] columns = new String[]{"*"};
        Cursor csr = mDB.query(TBL_BOOKMARK,columns,null,null,null,null,null);
        StringBuilder sb = new StringBuilder("Table ").append(TBL_BOOKMARK)
                .append(" has ")
                .append(String.valueOf(csr.getCount()))
                .append(" rows. The are :-");
        while (csr.moveToNext()) {
            sb.append("\n ROW ").append(String.valueOf(csr.getPosition() + 1));
            sb.append("\n\tCOLUMN ").append(COL_ID)
                    .append(hasval)
                    .append(String.valueOf(csr.getLong(csr.getColumnIndex(COL_ID))));
            sb.append("\n\tCOLUMN ").append(COl_NAME)
                    .append(hasval)
                    .append(csr.getString(csr.getColumnIndex(COl_NAME)));
            sb.append("\n\tCOLUMN ").append(COl_HIDDEN)
                    .append(hasval)
                    .append(String.valueOf(csr.getInt(csr.getColumnIndex(COl_HIDDEN)) > 0));
            sb.append("\n\tCOLUMN").append(COL_ICON)
                    .append(hasval)
                    .append(csr.getString(csr.getColumnIndex(COL_ICON)));
            sb.append("\n\tCOLUMN ").append(COL_NATIVEURL)
                    .append(hasval)
                    .append(csr.getString(csr.getColumnIndex(COL_NATIVEURL)));
            sb.append("\n\tCOLUMN ").append(COL_SEARCHURL)
                    .append(hasval)
                    .append(csr.getString(csr.getColumnIndex(COL_SEARCHURL)));
        }
        csr.close(); //<<<<< Should ALWAYS close a Cursor when done with it.
        Log.d("BOOKMARKDATA",sb.toString());
    }
}

MyAdapter.java (не проверено или изменено, я пропустил попытку заставить RecyclerView работать, так как слишком много разметок кода и т. Д., Которые недоступны).

FragmentBoomark.java

Примечание Вся работа выполняется в методе onAttach , исключающем необходимость работы onCreateView (поэтому он не работает, но).

Есть несколько дополнительных методов, которые вызываются. Обратите внимание, что некоторые предназначены исключительно для отладки / тестирования. Добавлены следующие методы: -

  • loadBookMarksFromXML
    • загружает базу данных из bookmark.xml (в основном это копия вашего кода, но сначала загружается в БД ЕСЛИ в БД нет строк ).
  • buildBookmarkArrayListfromDB
    • Builds arraylist согласно комментарию измените БД, тогда это должно быть вызвано, и RecyclerView необходимо обновить (notifydatasetChanged, я думаю, или эквивалент)

Вы заметили, что какой-то код был закомментирован при разборе XML (вероятно, оставьте это закомментированным), а другой - в первую очередь, чтобы исключить необходимость написания / угадывания другого кода.

: -

public class FragmentBookmark extends Fragment {

    BookmarkDBHelper mDB;

    ArrayList<Bookmark> arrayList = new ArrayList<>();
    MyAdapter myAdapter;
    View paramView;
    RecyclerView myRecyclerView;
    private Context mContext;
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mContext = context;
        mDB = new BookmarkDBHelper(mContext);
        mDB.logAllBookmarkRows();
        loadBookMarksFromXML();
        buildBookmarkArrayListfromDB();
        mDB.logAllBookmarkRows();

    }
    @Nullable
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        paramView = inflater.inflate(R.layout.bookmark, container, false);
        myRecyclerView =  paramView.findViewById(R.id.myRecyclerView);
        myRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
        myRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 4));
        myRecyclerView.setHasFixedSize(true);
        myAdapter = new MyAdapter(mContext, arrayList);
        myRecyclerView.setAdapter(myAdapter);
        /* MOVED
        try {
            XmlResourceParser xpp = getResources().getXml(R.xml.bookmarks);
            while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
                if (xpp.getEventType() == XmlPullParser.START_TAG) {
                    if (xpp.getName().equals("Bookmark")) {
                        Bookmark bookmark = new Bookmark();
                        bookmark.setName(xpp.getAttributeValue(null, "name"));
                        bookmark.setSearchUrl(xpp.getAttributeValue(null, "searchUrl"));
                        bookmark.setNativeUrl(xpp.getAttributeValue(null, "nativeUrl"));
                        int drawableResourceId = getResources().getIdentifier(xpp.getAttributeValue(null, "icon"),"drawable", mContext.getPackageName());
                        bookmark.setIcon(drawableResourceId);
                        bookmark.setViewType(0);
                        arrayList.add(bookmark);
                    }
                }
                xpp.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        */
        myAdapter.notifyDataSetChanged();
        Bookmark bookmark = new Bookmark();
        bookmark.setViewType(1);
        //bookmark.setIcon(R.drawable.add_new_bookmark_icon);
        arrayList.add(bookmark);
        return paramView;
    }


    private void loadBookMarksFromXML() {

        // MAY WISH TO ONLY DO THIS ONCE as bookmarks would be loaded OTHERWISE DELETE LINE BELOW
        if(DatabaseUtils.queryNumEntries(mDB.getWritableDatabase(),BookmarkDBHelper.TBL_BOOKMARK) > 0 ) return;
        try {
            XmlResourceParser xpp = getResources().getXml(R.xml.bookmarks);
            while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
                if (xpp.getEventType() == XmlPullParser.START_TAG) {
                    if (xpp.getName().equals("Bookmark")) {
                        Bookmark bookmark = new Bookmark();
                        bookmark.setName(xpp.getAttributeValue(null, "name"));
                        bookmark.setSearchUrl(xpp.getAttributeValue(null, "searchUrl"));
                        bookmark.setNativeUrl(xpp.getAttributeValue(null, "nativeUrl"));
                        int drawableResourceId = getResources().getIdentifier(xpp.getAttributeValue(null, "icon"),"drawable", mContext.getPackageName());
                        bookmark.setIcon(drawableResourceId);
                        bookmark.setViewType(0);
                        if (bookmark.getId() == null) {
                            bookmark.setId("-1");
                        }
                        mDB.addBookMark(
                                Long.valueOf(bookmark.getId()),
                                bookmark.getName(),
                                bookmark.getViewType() > 0,
                                String.valueOf(bookmark.getIcon()),
                                bookmark.getNativeUrl(),
                                bookmark.getSearchUrl()
                        );
                    }
                }
                xpp.next();
            }
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mDB.logAllBookmarkRows();
    }

    // CALL ME WHENEVER BOOKMARKS change
    private void buildBookmarkArrayListfromDB() {
        arrayList.clear();
        arrayList.addAll(mDB.getAllBookmarks());
    }
}

Результаты

  • (примечание NPE в конце - это когда запускается createView (как было сказано ранее, слишком много, чтобы сделать этот запуск основанным на догадках))

: -

2019-01-11 13:00:58.405 8021-8021/so54090082.so54090082 D/BOOKMARKDATA: Table bookmark has 0 rows. The are :-
2019-01-11 13:00:58.415 8021-8021/so54090082.so54090082 D/BOOKMARKDATA: Table bookmark has 13 rows. The are :-
     ROW 1
        COLUMN _id and has a value of 1
        COLUMN name and has a value of Bing
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://www.bing.com
     ROW 2
        COLUMN _id and has a value of 2
        COLUMN name and has a value of Google
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://www.google.com
     ROW 3
        COLUMN _id and has a value of 3
        COLUMN name and has a value of Youtube
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of http://m.youtube.com
     ROW 4
        COLUMN _id and has a value of 4
        COLUMN name and has a value of Facebook
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of facebook://
        COLUMN searchurl and has a value of https://m.facebook.com
     ROW 5
        COLUMN _id and has a value of 5
        COLUMN name and has a value of Twitter
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://mobile.twitte.com
     ROW 6
        COLUMN _id and has a value of 6
        COLUMN name and has a value of Instagram
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of instagram://
        COLUMN searchurl and has a value of https://instagram.com
     ROW 7
        COLUMN _id and has a value of 7
        COLUMN name and has a value of Gmail
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of googlemail://
        COLUMN searchurl and has a value of https://gmail.com
     ROW 8
        COLUMN _id and has a value of 8
        COLUMN name and has a value of Translate
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://
     ROW 9
        COLUMN _id and has a value of 9
        COLUMN name and has a value of Amazon
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://www.amazon.com
     ROW 10
        COLUMN _id and has a value of 10
        COLUMN name and has a value of Wikipedia
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of null
        COLUMN searchurl and has a value of http://en.m.wikipedia.org/w/index.php?title=Main_Page
     ROW 11
        COLUMN _id and has a value of 11
        COLUMN name and has a value of Weather
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of null
        COLUMN searchurl and has a value of http://weather.com
     ROW 12
        COLUMN _id and has a value of 12
        COLUMN name and has a value of eBay
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of null
        COLUMN searchurl and has a value of http://ebay.to/1VPVeAs
     ROW 13
        COLUMN _id and has a value of 13
        COLUMN name and has a value of Apple
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of null
        COLUMN searchurl and has a value of http://www.apple.com
2019-01-11 13:00:58.418 8021-8021/so54090082.so54090082 D/BOOKMARKDATA: Table bookmark has 13 rows. The are :-
     ROW 1
        COLUMN _id and has a value of 1
        COLUMN name and has a value of Bing
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://www.bing.com
     ROW 2
        COLUMN _id and has a value of 2
        COLUMN name and has a value of Google
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://www.google.com
     ROW 3
        COLUMN _id and has a value of 3
        COLUMN name and has a value of Youtube
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of http://m.youtube.com
     ROW 4
        COLUMN _id and has a value of 4
        COLUMN name and has a value of Facebook
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of facebook://
        COLUMN searchurl and has a value of https://m.facebook.com
     ROW 5
        COLUMN _id and has a value of 5
        COLUMN name and has a value of Twitter
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://mobile.twitte.com
     ROW 6
        COLUMN _id and has a value of 6
        COLUMN name and has a value of Instagram
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of instagram://
        COLUMN searchurl and has a value of https://instagram.com
     ROW 7
        COLUMN _id and has a value of 7
        COLUMN name and has a value of Gmail
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of googlemail://
        COLUMN searchurl and has a value of https://gmail.com
     ROW 8
        COLUMN _id and has a value of 8
        COLUMN name and has a value of Translate
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://
     ROW 9
        COLUMN _id and has a value of 9
        COLUMN name and has a value of Amazon
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://www.amazon.com
     ROW 10
        COLUMN _id and has a value of 10
        COLUMN name and has a value of Wikipedia
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of null
        COLUMN searchurl and has a value of http://en.m.wikipedia.org/w/index.php?title=Main_Page
     ROW 11
        COLUMN _id and has a value of 11
        COLUMN name and has a value of Weather
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of null
        COLUMN searchurl and has a value of http://weather.com
     ROW 12
        COLUMN _id and has a value of 12
        COLUMN name and has a value of eBay
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of null
        COLUMN searchurl and has a value of http://ebay.to/1VPVeAs
     ROW 13
        COLUMN _id and has a value of 13
        COLUMN name and has a value of Apple
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of null
        COLUMN searchurl and has a value of http://www.apple.com
2019-01-11 13:00:58.434 8021-8021/so54090082.so54090082 D/AndroidRuntime: Shutting down VM
2019-01-11 13:00:58.436 8021-8021/so54090082.so54090082 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: so54090082.so54090082, PID: 8021
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
        at so54090082.so54090082.ui.fragmentbookmark.FragmentBookmark.onCreateView(FragmentBookmark.java:53)

Результаты последующего прогона (т.е. данные были загружены ранее): -

2019-01-11 13:09:29.363 8159-8159/so54090082.so54090082 D/BOOKMARKDATA: Table bookmark has 13 rows. The are :-
     ROW 1
        COLUMN _id and has a value of 1
        COLUMN name and has a value of Bing
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of 0
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://www.bing.com
..........
0 голосов
/ 08 января 2019

Чтобы использовать базу данных SQLite, вы сначала проектируете ее (определите данные, которые вы хотите сохранить, и из этого таблицы и столбцы, в которые должны быть сохранены эти данные).

Из XML видно, что вы хотели бы сохранить следующие данные: -

  1. имя в виде строки (что соответствует тексту для SQLite)
  2. скрыто как логическое значение (SQLite не имеет типа для логического значения, поэтому можно использовать INTEGER)
  3. значок как текст
  4. id AS INTEGER
  5. nativeurl как ТЕКСТ
  6. searchurl как ТЕКСТ

Это будут столбцы, и закладка будет выглядеть как естественный выбор имени таблицы (для простоты предполагается, что подойдет одна таблица).

В идеале вы должны сделать более глубокий анализ данных и требований, таких как ограничения и индексы. Однако для простоты демонстрации предполагается, что id (поскольку это, вероятно, означает, что id обозначает один из вышеперечисленных (ряд))

В качестве резюме вы можете сказать, что вам нужна табличная закладка с 6 столбцами с колонкой id (которую мы назовем _id (иногда в Android это может потребоваться)) составление первичного ключа. Другие столбцы, как указано выше.

Чтобы создать такую ​​таблицу, вам нужно создать SQL, необходимый, чтобы указать SQLite СОЗДАТЬ таблицу. Подойдет следующее: -

CREATE TABLE IF NOT EXISTS bookmark (_id INTEGER PRIMARY KEY, name TEXT, hidden INTEGER, icon TEXT, nativeurl TEXT, searchurl TEXT);

Тем не менее, вы не можете просто запустить выше. Сначала вам нужна база данных, в которой будет находиться таблица (в базе данных может быть много таблиц).

Типичным (но не единственным способом) создания базы данных в Android является использование класса SQLiteOpenHelper , для которого необходимо создать подкласс. По линии class yourOpenHelper extends SQliteOpenHelper { ......... }.

Вы должны переопределить два метода onCreate и onUpgrade - onCreate запускается при первом создании базы данных ( note on onCreate запускается только один раз за время существования базы данных ). На данный момент в базе данных нет таблиц. Так что это, как правило, где вы будете создавать таблицы. - onUpgragde запускается при увеличении 4-го параметра, передаваемого в конструктор super (ниже значения константы DBVERSION используется для этого значения).

Настоятельно рекомендуется использовать константы для имен таблиц и столбцов, а затем всегда использовать эти константы. Из вышесказанного вы могли бы иметь (в качестве примера): -

public class BookmarkDBHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "bookmarks.db"; // The name of the database file
    public static final int DBVERSION = 1;  // The Database version

    public static final String TBL_BOOKMARK = "bookmark";
    public static final String COL_ID = BaseColumns._ID; // equates to _id
    public static final String COl_NAME = "name";
    public static final String COl_HIDDEN = "hidden";
    public static final String COL_ICON = "icon";
    public static final String COL_NATIVEURL = "nativeurl";
    public static final String COL_SEARCHURL = "searchurl";

    SQLiteDatabase mDB;

    public BookmarkDBHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        // Forces creation of the database (if it doesn't already exist)
        // and stores it when the BookmarkDBHelpr is instantiated
        mDB = this.getWritableDatabase();
    }

    /**
     * This creates the table(s) NOTE only automatically runs once
     */
    @Override
    public void onCreate(SQLiteDatabase db) {

        // The SQL to be used to create the table
        String crt_bookmark_tbl_sql = "CREATE TABLE IF NOT EXISTS " + TBL_BOOKMARK + "(" +
                COL_ID + " INTEGER PRIMARY KEY, " +
                COl_NAME + " TEXT, " +
                COl_HIDDEN + " INTEGER, " +
                COL_ICON + " TEXT, " +
                COL_NATIVEURL + " TEXT," +
                COL_SEARCHURL + " TEXT" +
                ")";
        db.execSQL(crt_bookmark_tbl_sql); // CREATE THE TABLE

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }

    /**
     * Adds a row
     */
    public long addBookMark(long id, String name, boolean hidden, String icon, String nativeurl, String searchurl) {
        ContentValues cv = new ContentValues();
        cv.put(COL_ID,id); // NOTE will not insert if id already exists.
        cv.put(COl_NAME,name);
        cv.put(COl_HIDDEN,hidden);
        cv.put(COL_ICON,icon);
        cv.put(COL_NATIVEURL,nativeurl);
        cv.put(COL_SEARCHURL,searchurl);
        // uses the convenience insert method that builds the SQL
        return mDB.insert(TBL_BOOKMARK,null,cv);
    }

    /**
     * Example of extracting data from the database
     */
    public void logAllBookmarkRows() {
        String hasval = " and has a value of ";
        String[] columns = new String[]{"*"};
        Cursor csr = mDB.query(TBL_BOOKMARK,columns,null,null,null,null,null);
        StringBuilder sb = new StringBuilder("Table ").append(TBL_BOOKMARK)
                .append(" has ")
                .append(String.valueOf(csr.getCount()))
                .append(" rows. The are :-");
        while (csr.moveToNext()) {
            sb.append("\n ROW ").append(String.valueOf(csr.getPosition() + 1));
            sb.append("\n\tCOLUMN ").append(COL_ID)
                    .append(hasval)
                    .append(String.valueOf(csr.getLong(csr.getColumnIndex(COL_ID))));
            sb.append("\n\tCOLUMN ").append(COl_NAME)
                    .append(hasval)
                    .append(csr.getString(csr.getColumnIndex(COl_NAME)));
            sb.append("\n\tCOLUMN ").append(COl_HIDDEN)
                    .append(hasval)
                    .append(String.valueOf(csr.getInt(csr.getColumnIndex(COl_HIDDEN)) > 0));
            sb.append("\n\tCOLUMN").append(COL_ICON)
                    .append(hasval)
                    .append(csr.getString(csr.getColumnIndex(COL_ICON)));
            sb.append("\n\tCOLUMN ").append(COL_NATIVEURL)
                    .append(hasval)
                    .append(csr.getString(csr.getColumnIndex(COL_NATIVEURL)));
            sb.append("\n\tCOLUMN ").append(COL_SEARCHURL)
                    .append(hasval)
                    .append(csr.getString(csr.getColumnIndex(COL_SEARCHURL)));
        }
        csr.close(); //<<<<< Should ALWAYS close a Cursor when done with it.
        Log.d("BOOKMARKDATA",sb.toString());
    }
}

В упражнении вы: -

  1. Создайте экземпляр вышеупомянутого класса, передавая Context
  2. Использование методов экземпляра объекта BookmarkDBHelper

например. : -

public class MainActivity extends AppCompatActivity {

    BookmarkDBHelper mDBhlpr; // Declare the mDBHlpr object

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDBhlpr = new BookmarkDBHelper(this); // Instantiate mDBHlpr
        mDBhlpr.addBookMark(1,"Coogle",false,"coogle","www.coogle.notcom","https://www.coogle.notcom");
        mDBhlpr.addBookMark(2,"Bong",true,"bong","","https://www.bong.net");
        mDBhlpr.logAllBookmarkRows();
    }
}
  • Вышеуказанное добавляет 2 (первые запуска) строки в таблицу закладок, а затем использует logAllBookMarkRows, чтобы затем извлечь данные из базы данных, записав результаты в журнал.

Результат

2019-01-09 07:09:26.817 2112-2112/ptfc.populatetablefromcursor D/BOOKMARKDATA: Table bookmark has 2 rows. The are :-
     ROW 1
        COLUMN _id and has a value of 1
        COLUMN name and has a value of Coogle
        COLUMN hidden and has a value of false
        COLUMNicon and has a value of coogle
        COLUMN nativeurl and has a value of www.coogle.notcom
        COLUMN searchurl and has a value of https://www.coogle.notcom
     ROW 2
        COLUMN _id and has a value of 2
        COLUMN name and has a value of Bong
        COLUMN hidden and has a value of true
        COLUMNicon and has a value of bong
        COLUMN nativeurl and has a value of 
        COLUMN searchurl and has a value of https://www.bong.net

Примечание это предназначено исключительно как руководство для перехода к этапу, на котором в принципе вы можете создать базу данных SQLite, сохранить данные и получить данные, чтобы ответить: -

Я не знаю, как создать базу данных SQLite, которая будет извлекать данные, и я можете сохранить там новую запись.

Вам, несомненно, придется адаптировать вышеприведенное для соответствия , например, (но не ограничиваясь этим), возможно, изменения метода addBookmark для принятия BookMark в качестве параметр.

Примечание

Если вышеприведенное будет выполнено во второй раз, оно будет работать и давать одинаковый вывод, НО две строки не будут добавлены, поскольку идентификаторы будут одинаковыми (_id INTEGER PRIMARY подразумевает ограничение UNQIUE). 2 исключения будут сгенерированы, но в ловушке, и журнал будет содержать что-то похожее на: -

2019-01-09 07:30:51.736 2295-2295/? E/SQLiteDatabase: Error inserting name=Coogle icon=coogle searchurl=https://www.coogle.notcom _id=1 hidden=false nativeurl=www.coogle.notcom
    android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: bookmark._id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1564)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
        at ptfc.populatetablefromcursor.BookmarkDBHelper.addBookMark(BookmarkDBHelper.java:70)
        at ptfc.populatetablefromcursor.MainActivity.onCreate(MainActivity.java:21)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2894)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3049)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6680)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-01-09 07:30:51.738 2295-2295/? E/SQLiteDatabase: Error inserting name=Bong icon=bong searchurl=https://www.bong.net _id=2 hidden=true nativeurl=
    android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: bookmark._id (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY)
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:796)
        at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
        at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
        at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1564)
        at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1433)
        at ptfc.populatetablefromcursor.BookmarkDBHelper.addBookMark(BookmarkDBHelper.java:70)
        at ptfc.populatetablefromcursor.MainActivity.onCreate(MainActivity.java:22)
        at android.app.Activity.performCreate(Activity.java:7136)
        at android.app.Activity.performCreate(Activity.java:7127)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2894)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3049)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6680)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)

Дополнительно

Согласно комментарию Вам нужно извлечь строки из базы данных (см. LogAllBookmarks, как получить данные) в ArrayList (т.е. ваш arrayList).

В соответствии с кодом БД класс BookMark был изменен на: -

public class Bookmark {
    String name, id, nativeUrl, searchUrl;
    long db_id; //<<<<<<<<< ADDED should really use long for id's
    String icon_name; //<<<<<<<<<< ADDED
    int icon;
    int viewType; //<<<<<<<<<< COLUMN HIDDEN in DB

    // ADDED as needed because empty contructor only exists by default if no other constructors exist
    public Bookmark() {
    }

    public Bookmark(long dbid, String name, String icon_name, String nativeUrl, String searchUrl, int hidden ) {

        this.db_id = dbid;
        this.id = String.valueOf(db_id);
        this.name = name;
        this.icon_name = icon_name;
        //<<<<<<<<<< ....... Shoud get icon id and set it here
        this.nativeUrl = nativeUrl;
        this.searchUrl = searchUrl;
        this.viewType = hidden;
    }

    //<<<<<<<<<< START Of NEW GETTERS AND SETTERS
    public void setDb_id(long db_id) {
        this.db_id = db_id;
    }

    public long getDb_id() {
        return db_id;
    }

    public void setIcon_name(String icon_name) {
        this.icon_name = icon_name;
    }

    public String getIcon_name() {
        return icon_name;
    }
    //<<<<<<<<<< END OF NEW GETTERS AND SETTERS


    public String getName() { return name; }
    public void setName(String name) {
        this.name = name;
    }

    public int getIcon() { return icon; }
    public void setIcon(int icon) {
        this.icon = icon;
    }

    public String getId(){
        return id;
    }

    public void setId(String id) {
        this.id = id;
        this.db_id = Integer.parseInt(id);
    }

    public String getNativeUrl() {
        return nativeUrl;
    }

    public void setNativeUrl(String nativeUrl) {
        this.nativeUrl = nativeUrl;
    }

    public String getSearchUrl() {
        return searchUrl;
    }

    public void setSearchUrl(String searchUrl) {
        this.searchUrl = searchUrl;
    }
    public int getViewType() {
        return viewType;
    }

    public void setViewType(int viewType) {
        this.viewType = viewType;
    }


    @Override
    public String toString() {
        return "Bookmark{" +
                "name='" + name + '\'' +
                ", icon='" + icon + '\'' +
                ", id='" + id + '\'' +
                ", nativeUrl='" + nativeUrl + '\'' +
                ", searchUrl='" + searchUrl + '\'' +
                '}';
    }
}
  • ПРИМЕЧАНИЕ см. Комментарии, так как у вас могут возникнуть проблемы с viewType

Теперь следующий метод, добавленный в DatabseHelper BookmarDBHelper.java , вернет ArrayList закладок из базы данных: -

public ArrayList<Bookmark> getAllBookmarks() {
    ArrayList<Bookmark> rv  = new ArrayList<>();
    Cursor csr = mDB.query(TBL_BOOKMARK,null,null,null,null,null,null);
    while (csr.moveToNext()) {
        rv.add(new Bookmark(
                csr.getLong(csr.getColumnIndex(COL_ID)),
                csr.getString(csr.getColumnIndex(COl_NAME)),
                csr.getString(csr.getColumnIndex(COL_ICON)),
                csr.getString(csr.getColumnIndex(COL_NATIVEURL)),
                csr.getString(csr.getColumnIndex(COL_SEARCHURL)),
                csr.getInt(csr.getColumnIndex(COl_HIDDEN))
        ));
    }
    return rv;
}

- Note if no rows exists then the returned ArrayList will have a size of 0.

Пример использования (как будто действие выше) "-

    ArrayList<Bookmark> arrylist = mDBhlpr.getAllBookmarks();
    for (Bookmark b: arrylist) {
        Log.d("BOOKMARKFROMLIST",b.toString());
    }

Результаты: -

2019-01-09 12:30:44.663 1701-1701/ptfc.populatetablefromcursor D/BOOKMARKFROMLIST: Bookmark{name='Coogle', icon='0', id='1', nativeUrl='www.coogle.notcom', searchUrl='https://www.coogle.notcom'}
2019-01-09 12:30:44.665 1701-1701/ptfc.populatetablefromcursor D/BOOKMARKFROMLIST: Bookmark{name='Bong', icon='0', id='2', nativeUrl='', searchUrl='https://www.bong.net'}
...