Чтобы использовать базу данных SQLite, вы сначала проектируете ее (определите данные, которые вы хотите сохранить, и из этого таблицы и столбцы, в которые должны быть сохранены эти данные).
Из XML видно, что вы хотели бы сохранить следующие данные: -
- имя в виде строки (что соответствует тексту для SQLite)
- скрыто как логическое значение (SQLite не имеет типа для логического значения, поэтому можно использовать INTEGER)
- значок как текст
- id AS INTEGER
- nativeurl как ТЕКСТ
- 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());
}
}
В упражнении вы: -
- Создайте экземпляр вышеупомянутого класса, передавая Context
- Использование методов экземпляра объекта 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'}