Refine database import export

This commit is contained in:
tarsin committed 2022-08-04 06:35:42 +08:00
1 parent 4ee2cdf19c
commit e353bbe4c3
20 files changed
+225 -51

No files matched your search

+158 -2
View File
@@ -29,6 +29,7 @@ import androidx.room.Room;
import com.hippo.ehviewer.client.data.GalleryInfo;
import com.hippo.ehviewer.client.data.ListUrlBuilder;
import com.hippo.ehviewer.dao.BasicDao;
import com.hippo.ehviewer.dao.DownloadDirname;
import com.hippo.ehviewer.dao.DownloadDirnameDao;
import com.hippo.ehviewer.dao.DownloadInfo;
@@ -43,9 +44,18 @@ import com.hippo.ehviewer.dao.LocalFavoriteInfo;
import com.hippo.ehviewer.dao.LocalFavoritesDao;
import com.hippo.ehviewer.dao.QuickSearch;
import com.hippo.ehviewer.dao.QuickSearchDao;
import com.hippo.ehviewer.download.DownloadManager;
import com.hippo.util.ExceptionUtils;
import com.hippo.yorozuya.IOUtils;
import com.hippo.yorozuya.ObjectUtils;
import com.hippo.yorozuya.collect.SparseJLArray;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
@@ -53,6 +63,8 @@ public class EhDB {
private static final String TAG = EhDB.class.getSimpleName();
private static final int CUR_DB_VER = 4;
private static final int MAX_HISTORY_COUNT = 200;
private static EhDatabase db;
@@ -589,15 +601,159 @@ public class EhDB {
db.filterDao().update(filter);
}
public static synchronized boolean exportDB(Context context, Uri uri) {
private static <T> boolean copyDao(BasicDao<T> from, BasicDao<T> to) {
List<T> list = from.fakeList();
for (T item : list)
to.fakeInsert(item);
return false;
}
public static synchronized boolean exportDB(Context context, Uri uri) {
final String ehExportName = "eh.export.db";
// Delete old export db
context.deleteDatabase(ehExportName);
EhDatabase newDb = Room.databaseBuilder(context, EhDatabase.class, ehExportName).allowMainThreadQueries().build();
try {
// Copy data to a export db
if (copyDao(db.downloadsDao(), newDb.downloadsDao()))
return false;
if (copyDao(db.downloadLabelDao(), newDb.downloadLabelDao()))
return false;
if (copyDao(db.downloadDirnameDao(), newDb.downloadDirnameDao()))
return false;
if (copyDao(db.historyDao(), newDb.historyDao()))
return false;
if (copyDao(db.quickSearchDao(), newDb.quickSearchDao()))
return false;
if (copyDao(db.localFavoritesDao(), newDb.localFavoritesDao()))
return false;
if (copyDao(db.filterDao(), newDb.filterDao()))
return false;
// Copy export db to data dir
File dbFile = context.getDatabasePath(ehExportName);
if (dbFile == null || !dbFile.isFile()) {
return false;
}
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(dbFile);
os = context.getContentResolver().openOutputStream(uri);
IOUtils.copy(is, os);
return true;
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(os);
}
// Delete failed file
return false;
} finally {
context.deleteDatabase(ehExportName);
}
}
/**
* @return error string, null for no error
*/
public static synchronized String importDB(Context context, Uri uri) {
return "";
try {
InputStream inputStream = context.getContentResolver().openInputStream(uri);
File file = File.createTempFile("importDatabase", "");
FileOutputStream outputStream = new FileOutputStream(file);
byte[] buff = new byte[1024];
int read;
if (inputStream != null) {
while ((read = inputStream.read(buff, 0, buff.length)) > 0) {
outputStream.write(buff, 0, read);
}
} else {
return context.getString(R.string.cant_read_the_file);
}
inputStream.close();
outputStream.close();
SQLiteDatabase oldDB = SQLiteDatabase.openDatabase(
file.getPath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
int newVersion = CUR_DB_VER;
int oldVersion = oldDB.getVersion();
if (oldVersion < newVersion) {
upgradeDB(oldDB, oldVersion);
oldDB.setVersion(newVersion);
} else if (oldVersion > newVersion) {
return context.getString(R.string.cant_read_the_file);
}
String tmpDBName = "tmp.db";
context.deleteDatabase(tmpDBName);
EhDatabase oldRoomDatabase = Room.databaseBuilder(context, EhDatabase.class, tmpDBName)
.createFromFile(file).allowMainThreadQueries().build();
// Downloads
DownloadManager manager = EhApplication.getDownloadManager(context);
List<DownloadInfo> downloadInfoList = oldRoomDatabase.downloadsDao().list();
manager.addDownload(downloadInfoList, false);
// Download label
List<DownloadLabel> downloadLabelList = oldRoomDatabase.downloadLabelDao().list();
manager.addDownloadLabel(downloadLabelList);
// Download dirname
List<DownloadDirname> downloadDirnameList = oldRoomDatabase.downloadDirnameDao().fakeList();
for (DownloadDirname dirname : downloadDirnameList) {
putDownloadDirname(dirname.getGid(), dirname.getDirname());
}
// History
List<HistoryInfo> historyInfoList = oldRoomDatabase.historyDao().list();
putHistoryInfo(historyInfoList);
// QuickSearch
List<QuickSearch> quickSearchList = oldRoomDatabase.quickSearchDao().list();
List<QuickSearch> currentQuickSearchList = db.quickSearchDao().list();
List<QuickSearch> importList = new ArrayList<>();
for (QuickSearch quickSearch : quickSearchList) {
String name = quickSearch.name;
for (QuickSearch q : currentQuickSearchList) {
if (ObjectUtils.equal(q.name, name)) {
// The same name
name = null;
break;
}
}
if (null == name) {
continue;
}
importList.add(quickSearch);
}
importQuickSearch(importList);
// LocalFavorites
List<LocalFavoriteInfo> localFavoriteInfoList = oldRoomDatabase.localFavoritesDao().list();
for (LocalFavoriteInfo info : localFavoriteInfoList) {
putLocalFavorites(info);
}
// Filter
List<Filter> filterList = oldRoomDatabase.filterDao().list();
List<Filter> currentFilterList = db.filterDao().list();
for (Filter filter : filterList) {
if (!currentFilterList.contains(filter)) {
addFilter(filter);
}
}
return null;
} catch (Throwable e) {
ExceptionUtils.throwIfFatal(e);
// Ignore
return context.getString(R.string.cant_read_the_file);
}
}
private static class OldDBHelper extends SQLiteOpenHelper {
@@ -195,6 +195,7 @@ public class GalleryInfo implements Parcelable {
}
private void generateSLangFromTags() {
assert simpleTags != null;
for (String tag : simpleTags) {
for (int i = 0; i < S_LANGS.length; i++) {
if (S_LANG_TAGS[i].equals(tag)) {
@@ -0,0 +1,8 @@
package com.hippo.ehviewer.dao;
import java.util.List;
public interface BasicDao<T> {
List<T> fakeList();
void fakeInsert(T t);
}
@@ -9,8 +9,7 @@ import com.hippo.ehviewer.client.data.GalleryInfo;
@Entity(tableName = "BOOKMARKS")
public class BookmarkInfo extends GalleryInfo {
public static final Creator<BookmarkInfo> CREATOR = new Creator<BookmarkInfo>() {
public static final Creator<BookmarkInfo> CREATOR = new Creator<>() {
@Override
public BookmarkInfo createFromParcel(Parcel source) {
return new BookmarkInfo(source);
@@ -158,5 +157,4 @@ public class BookmarkInfo extends GalleryInfo {
dest.writeInt(this.page);
dest.writeLong(this.time);
}
}
@@ -5,12 +5,10 @@ import androidx.room.Delete;
import androidx.room.Insert;
@Dao
public interface BookmarksBao {
public interface BookmarksDao {
@Insert
void insert(BookmarkInfo bookmark);
@Delete
void delete(BookmarkInfo bookmark);
}
@@ -6,7 +6,6 @@ import androidx.room.PrimaryKey;
@Entity(tableName = "DOWNLOAD_DIRNAME")
public class DownloadDirname {
@PrimaryKey
@ColumnInfo(name = "GID")
private long gid;
@@ -28,5 +27,4 @@ public class DownloadDirname {
public void setDirname(String dirname) {
this.dirname = dirname;
}
}
@@ -5,9 +5,10 @@ import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
@Dao
public interface DownloadDirnameDao {
import java.util.List;
@Dao
public interface DownloadDirnameDao extends BasicDao<DownloadDirname> {
@Query("SELECT * FROM DOWNLOAD_DIRNAME WHERE GID = :gid")
DownloadDirname load(long gid);
@@ -15,11 +16,17 @@ public interface DownloadDirnameDao {
void update(DownloadDirname downloadDirname);
@Insert
void insert(DownloadDirname downloadDirname);
long insert(DownloadDirname downloadDirname);
@Query("DELETE FROM DOWNLOAD_DIRNAME WHERE GID = :gid")
void deleteByKey(long gid);
@Query("DELETE FROM DOWNLOAD_DIRNAME")
void deleteAll();
@Query("SELECT * FROM DOWNLOAD_DIRNAME")
List<DownloadDirname> fakeList();
@Insert
void fakeInsert(DownloadDirname t);
}
@@ -10,8 +10,7 @@ import com.hippo.ehviewer.client.data.GalleryInfo;
@Entity(tableName = "DOWNLOADS")
public class DownloadInfo extends GalleryInfo {
public static final Creator<DownloadInfo> CREATOR = new Creator<DownloadInfo>() {
public static final Creator<DownloadInfo> CREATOR = new Creator<>() {
@Override
public DownloadInfo createFromParcel(Parcel source) {
return new DownloadInfo(source);
@@ -250,5 +249,4 @@ public class DownloadInfo extends GalleryInfo {
public void setTotal(int total) {
this.total = total;
}
}
@@ -6,7 +6,6 @@ import androidx.room.PrimaryKey;
@Entity(tableName = "DOWNLOAD_LABELS")
public class DownloadLabel {
@PrimaryKey
@ColumnInfo(name = "_id")
private Long id;
@@ -38,5 +37,4 @@ public class DownloadLabel {
public void setTime(long time) {
this.time = time;
}
}
@@ -9,8 +9,7 @@ import androidx.room.Update;
import java.util.List;
@Dao
public interface DownloadLabelDao {
public interface DownloadLabelDao extends BasicDao<DownloadLabel> {
@Query("SELECT * FROM DOWNLOAD_LABELS ORDER BY TIME ASC")
List<DownloadLabel> list();
@@ -28,4 +27,10 @@ public interface DownloadLabelDao {
@Delete
void delete(DownloadLabel downloadLabel);
@Query("SELECT * FROM DOWNLOAD_LABELS ORDER BY TIME ASC")
List<DownloadLabel> fakeList();
@Insert
void fakeInsert(DownloadLabel t);
}
@@ -9,10 +9,7 @@ import androidx.room.Update;
import java.util.List;
@Dao
public interface DownloadsDao {
String TABLENAME = "DOWNLOADS";
public interface DownloadsDao extends BasicDao<DownloadInfo> {
@Query("SELECT * FROM DOWNLOADS ORDER BY TIME DESC")
List<DownloadInfo> list();
@@ -23,9 +20,14 @@ public interface DownloadsDao {
void update(DownloadInfo downloadInfo);
@Insert
void insert(DownloadInfo downloadInfo);
long insert(DownloadInfo downloadInfo);
@Delete
void delete(DownloadInfo downloadInfo);
@Query("SELECT * FROM DOWNLOADS ORDER BY TIME DESC")
List<DownloadInfo> fakeList();
@Insert
void fakeInsert(DownloadInfo t);
}
@@ -5,7 +5,7 @@ import androidx.room.RoomDatabase;
@Database(entities = {BookmarkInfo.class, DownloadInfo.class, DownloadLabel.class, DownloadDirname.class, Filter.class, HistoryInfo.class, LocalFavoriteInfo.class, QuickSearch.class}, version = 4, exportSchema = false)
public abstract class EhDatabase extends RoomDatabase {
public abstract BookmarksBao bookmarksBao();
public abstract BookmarksDao bookmarksBao();
public abstract DownloadDirnameDao downloadDirnameDao();
@@ -9,7 +9,6 @@ import com.hippo.yorozuya.ObjectUtils;
@Entity(tableName = "FILTER")
public class Filter {
@ColumnInfo(name = "MODE")
public int mode;
@ColumnInfo(name = "TEXT")
@@ -65,5 +64,4 @@ public class Filter {
Filter filter = (Filter) o;
return filter.mode == mode && ObjectUtils.equal(filter.text, text);
}
}
@@ -9,10 +9,7 @@ import androidx.room.Update;
import java.util.List;
@Dao
public interface FilterDao {
String TABLENAME = "FILTER";
public interface FilterDao extends BasicDao<Filter> {
@Query("SELECT * FROM FILTER")
List<Filter> list();
@@ -25,4 +22,9 @@ public interface FilterDao {
@Delete
void delete(Filter filter);
@Query("SELECT * FROM FILTER")
List<Filter> fakeList();
@Insert
void fakeInsert(Filter t);
}
@@ -9,8 +9,7 @@ import androidx.room.Update;
import java.util.List;
@Dao
public interface HistoryDao {
public interface HistoryDao extends BasicDao<HistoryInfo> {
@Query("SELECT * FROM HISTORY WHERE GID = :gid")
HistoryInfo load(long gid);
@@ -24,7 +23,7 @@ public interface HistoryDao {
void update(HistoryInfo historyInfo);
@Insert
void insert(HistoryInfo historyInfo);
long insert(HistoryInfo historyInfo);
@Delete
void delete(HistoryInfo historyInfos);
@@ -35,4 +34,9 @@ public interface HistoryDao {
@Query("DELETE FROM HISTORY")
void deleteAll();
@Query("SELECT * FROM HISTORY ORDER BY TIME DESC")
List<HistoryInfo> fakeList();
@Insert
void fakeInsert(HistoryInfo t);
}
@@ -9,8 +9,7 @@ import com.hippo.ehviewer.client.data.GalleryInfo;
@Entity(tableName = "HISTORY")
public class HistoryInfo extends GalleryInfo {
public static final Creator<HistoryInfo> CREATOR = new Creator<HistoryInfo>() {
public static final Creator<HistoryInfo> CREATOR = new Creator<>() {
@Override
public HistoryInfo createFromParcel(Parcel source) {
return new HistoryInfo(source);
@@ -158,5 +157,4 @@ public class HistoryInfo extends GalleryInfo {
dest.writeInt(this.mode);
dest.writeLong(this.time);
}
}
@@ -10,7 +10,7 @@ import com.hippo.ehviewer.client.data.GalleryInfo;
@Entity(tableName = "LOCAL_FAVORITES")
public class LocalFavoriteInfo extends GalleryInfo {
public static final Creator<LocalFavoriteInfo> CREATOR = new Creator<LocalFavoriteInfo>() {
public static final Creator<LocalFavoriteInfo> CREATOR = new Creator<>() {
@Override
public LocalFavoriteInfo createFromParcel(Parcel source) {
return new LocalFavoriteInfo(source);
@@ -144,5 +144,4 @@ public class LocalFavoriteInfo extends GalleryInfo {
super.writeToParcel(dest, flags);
dest.writeLong(this.time);
}
}
@@ -8,10 +8,7 @@ import androidx.room.Query;
import java.util.List;
@Dao
public interface LocalFavoritesDao {
String TABLENAME = "LOCAL_FAVORITES";
public interface LocalFavoritesDao extends BasicDao<LocalFavoriteInfo> {
@Query("SELECT * FROM LOCAL_FAVORITES ORDER BY TIME DESC")
List<LocalFavoriteInfo> list();
@@ -22,7 +19,7 @@ public interface LocalFavoritesDao {
LocalFavoriteInfo load(long gid);
@Insert
void insert(LocalFavoriteInfo localFavoriteInfo);
long insert(LocalFavoriteInfo localFavoriteInfo);
@Delete
void delete(LocalFavoriteInfo localFavoriteInfo);
@@ -30,4 +27,9 @@ public interface LocalFavoritesDao {
@Query("DELETE FROM LOCAL_FAVORITES WHERE GID = :gid")
void deleteByKey(long gid);
@Query("SELECT * FROM LOCAL_FAVORITES ORDER BY TIME DESC")
List<LocalFavoriteInfo> fakeList();
@Insert
void fakeInsert(LocalFavoriteInfo t);
}
@@ -1,12 +1,12 @@
package com.hippo.ehviewer.dao;
import androidx.annotation.NonNull;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity(tableName = "QUICK_SEARCH")
public class QuickSearch {
@PrimaryKey
@ColumnInfo(name = "_id")
public Long id;
@@ -109,9 +109,9 @@ public class QuickSearch {
this.time = time;
}
@NonNull
@Override
public String toString() {
return name;
}
}
@@ -9,10 +9,7 @@ import androidx.room.Update;
import java.util.List;
@Dao
public interface QuickSearchDao {
String TABLENAME = "QUICK_SEARCH";
public interface QuickSearchDao extends BasicDao<QuickSearch> {
@Query("SELECT * FROM QUICK_SEARCH ORDER BY TIME ASC")
List<QuickSearch> list();
@@ -31,4 +28,9 @@ public interface QuickSearchDao {
@Delete
void delete(QuickSearch quickSearch);
@Query("SELECT * FROM QUICK_SEARCH ORDER BY TIME ASC")
List<QuickSearch> fakeList();
@Insert
void fakeInsert(QuickSearch t);
}