catalog.json
. Исправим это.
Прежде всего нам понадобятся методы чтения и записи экземпляров
Book
в базу данных, поэтому добавим их:
Java
public class BookTransactions {
public static Book read(SQLiteDatabase database, String isbn) {
Cursor cursor = database.query(
DbHelper.BOOKS_TABLE_NAME, // Строка, имя запрашиваемой таблицы
null, // Строка, массив столбцов
DbHelper.BOOKS_COLUMN_ISBN + " = ?", // Строка, предложение WHERE
new String[] { isbn }, // Строка, массив значений для предложения WHERE
null, // GROUP BY
null, // HAVING
null, // ORDER BY
"1" // Строка, предложение LIMIT
);
if (cursor.moveToNext()) {
val book = Book(
cursor.getString(0),
mutableListOf(),
isbn,
cursor.getInt(2),
cursor.getInt(3) == 1
)
readAuthors(database, book);
return Book()
}
cursor.close();
return Book()
}
public static void write(SQLiteDatabase database, Book book) {
ContentValues contentValues = new ContentValues();
contentValues.put(DbHelper.BOOKS_COLUMN_ISBN, book.getIsbn());
contentValues.put(DbHelper.BOOKS_COLUMN_TITLE, book.getTitle());
contentValues.put(DbHelper.BOOKS_COLUMN_PAGECOUNT, book.getPageCount());
contentValues.put(DbHelper.BOOKS_COLUMN_ISFICTION, book.isFiction());
326
Сохранность данных
database.beginTransaction();
try {
insertOrUpdate(
database,
DbHelper.BOOKS_TABLE_NAME,
contentValues,
DbHelper.BOOKS_COLUMN_ISBN + " = ? ",
new String[] { book.getIsbn() });
for (String author : book.getAuthors()) {
contentValues = new ContentValues();
contentValues.put(DbHelper.AUTHORS_COLUMN_NAME, author);
database.insertWithOnConflict(DbHelper.AUTHORS_TABLE_NAME, null,
contentValues, SQLiteDatabase.CONFLICT_IGNORE);
}
database.setTransactionSuccessful();
Log.d("MyTag", "wrote data to database");
} catch (Exception e) {
Log.d("MyTag", "there was a problem inserting data: " + e.getMessage());
} finally {
Log.d("MyTag", "finally");
database.endTransaction();
}
}
public static boolean insertOrUpdate(SQLiteDatabase database, String table,
ContentValues values,
String where, String[] args) {
long rowId = database.insertWithOnConflict(table, null, values,
SQLiteDatabase.CONFLICT_IGNORE);
if (rowId < 0) {
database.update(table, values, where, args);
return false;
}
return true;
}
public static void readAuthors(SQLiteDatabase database, Book book) {
Cursor cursor = database.query(
DbHelper.AUTHORS_TABLE_NAME
+ " join "
+ DbHelper.BRIDGE_TABLE_NAME
+ " on "
+ DbHelper.AUTHORS_TABLE_NAME + "." + DbHelper.AUTHORS_COLUMN_ID
+ " = "
// Строка, имя запрашиваемой таблицы
+ DbHelper.BRIDGE_TABLE_NAME + "." + DbHelper.BRIDGE_COLUMN_AUTHOR_ID,
new String[] { DbHelper.AUTHORS_COLUMN_NAME }, // Строка, массив столбцов
DbHelper.BRIDGE_COLUMN_AUTHOR_ID + " = ?", // Строка, предложение WHERE
new String[] { book.getIsbn() }, // Строка, массив значений для WHERE
null, // GROUP BY
null, // HAVING
null // ORDER BY
);
Запись книг в хранилище
327
String[] authors = new String[cursor.getCount()];
int i = 0;
while (!cursor.isAfterLast()) {
cursor.moveToNext();
authors[i++] = cursor.getString(0);
}
book.setAuthors(authors);
}
}
Kotlin
object BookTransactions {
fun read(database: SQLiteDatabase, isbn: String): Book {
val cursor = database.query(
DbHelper.BOOKS_TABLE_NAME,
null ,
DbHelper.BOOKS_COLUMN_ISBN + " = ?",
arrayOf(isbn), null, null, null, "1"
)
val book = Book()
book.isbn = isbn
if (cursor.moveToNext()) {
book.title = cursor.getString(0)
book.pageCount = cursor.getInt(2)
book.isFiction = cursor.getInt(3) == 1
readAuthors(database, book)
}
cursor.close()
return book
}
fun write(database: SQLiteDatabase, book: Book) {
var contentValues = ContentValues()
contentValues.put(DbHelper.BOOKS_COLUMN_ISBN, book.isbn)
contentValues.put(DbHelper.BOOKS_COLUMN_TITLE, book.title)
contentValues.put(DbHelper.BOOKS_COLUMN_PAGECOUNT, book.pageCount)
contentValues.put(DbHelper.BOOKS_COLUMN_ISFICTION, book.isFiction)
database.beginTransaction()
try {
insertOrUpdate(
database,
DbHelper.BOOKS_TABLE_NAME,
contentValues,
DbHelper.BOOKS_COLUMN_ISBN + " = ? ",
arrayOf(book.isbn))
for (author in book.authors) {
contentValues = ContentValues()
contentValues.put(DbHelper.AUTHORS_COLUMN_NAME, author)
database.insertWithOnConflict(DbHelper.AUTHORS_TABLE_NAME, null, contentValues,
SQLiteDatabase.CONFLICT_IGNORE)
}
328
Сохранность данных
database.setTransactionSuccessful()
Log.d("MyTag", "wrote data to database")
} catch (e: Exception) {
Log.d("MyTag", "there was a problem inserting data: " + e.message)
} finally {
Log.d("MyTag", "finally")
database.endTransaction()
}
}
fun insertOrUpdate(database: SQLiteDatabase, table: String,
values: ContentValues, where: String,
args: Array ): Boolean {
val rowId = database.insertWithOnConflict(table, null, values,
SQLiteDatabase.CONFLICT_IGNORE)
if (rowId < 0) {
database.update(table, values, where, args)
return false
}
return true
}
fun readAuthors(database: SQLiteDatabase, book: Book) {
val cursor = database.query(
DbHelper.AUTHORS_TABLE_NAME
+ " join "
+ DbHelper.BRIDGE_TABLE_NAME
+ " on "
+ DbHelper.AUTHORS_TABLE_NAME + "." + DbHelper.AUTHORS_COLUMN_ID
+ " = "
// Строка, имя запрашиваемой таблицы
+ DbHelper.BRIDGE_TABLE_NAME + "." + DbHelper.BRIDGE_COLUMN_AUTHOR_ID,
arrayOf(DbHelper.AUTHORS_COLUMN_NAME), // Строка, массив столбцов
DbHelper.BRIDGE_COLUMN_AUTHOR_ID + " = ?", // Строка, предложение WHERE
arrayOf(book.isbn), null, null, null
)
var i = 0
while (!cursor.isAfterLast) {
cursor.moveToNext()
book.authors[i++] = cursor.getString(0)
}
cursor.close()
}
}
Теперь, имея вспомогательные методы чтения/записи данных
Book
, добавим
в наш класс
DbHelper
чтение содержимого файла
Do'stlaringiz bilan baham: |