Loading app/src/main/java/io/eelo/drive/database/DbHelper.java +19 −19 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ import io.eelo.drive.models.SyncedFileState; public final class DbHelper extends SQLiteOpenHelper { final private static String TAG = DbHelper.class.getSimpleName(); //Tag for log private static final int DATABASE_VERSION = 14; private static final int DATABASE_VERSION = 19; public static final String DATABASE_NAME = "eelo_drive.db"; /** Loading Loading @@ -177,13 +177,29 @@ public final class DbHelper extends SQLiteOpenHelper { * @param context app or service activity * @return List<Folder> a list of SyncedFolder from DB */ public static List<SyncedFolder> getSyncedFolders(Context context) { public static List<SyncedFolder> getAllSyncedFolders(Context context) { SyncedFolderDAO dao = openSyncedFolderDAO(context, false); List<SyncedFolder> mSyncedFolder = new ArrayList<SyncedFolder>(); if(dao == null){ return mSyncedFolder; }else { mSyncedFolder = dao.getAllSyncedFolders(SyncedFolderContract.ENABLED); mSyncedFolder = dao.getSyncedFolderList(SyncedFolderContract.ENABLED+" = 1 ", null ); dao.close(); return mSyncedFolder; } } public static List<SyncedFolder> getSyncedFolderList(Context context, boolean isMediaType) { SyncedFolderDAO dao = openSyncedFolderDAO(context, false); List<SyncedFolder> mSyncedFolder = new ArrayList<>(); if(dao == null){ return mSyncedFolder; } else { mSyncedFolder = dao.getSyncedFolderList(SyncedFolderContract.ENABLED+" = 1 AND " +SyncedFolderContract.IS_MEDIA_TYPE+" = ?", new String[] {(isMediaType)? "1":"0"} ); dao.close(); return mSyncedFolder; } Loading Loading @@ -222,22 +238,6 @@ public final class DbHelper extends SQLiteOpenHelper { return result; } /** * Delete a syncedFolder and its relative SyncedFileState * @param id Id of the syncedFolder to remove * @param context context to use * @return */ public static int deleteSyncedFolderAndSyncedFileStates(long id, Context context){ SyncedFileStateDAO dao = openSyncedFileStateDAO(context, true); if(dao == null){ return -1; } int result = dao.deleteByFolder(id); dao.close(); return result+deleteSyncedFolder(id, context); } /** * Set the lastModified value of SyncedFolder to 1. * The goal is to force to rescan it next time. Loading app/src/main/java/io/eelo/drive/database/SyncedFileStateContract.java +2 −2 Original line number Diff line number Diff line Loading @@ -17,8 +17,6 @@ import android.provider.BaseColumns; class SyncedFileStateContract implements BaseColumns{ /** Table structure **/ static final String TABLE_NAME ="synced_file_state"; static final String FILE_NAME ="file_name"; static final String LOCAL_PATH ="local_path"; Loading @@ -26,6 +24,7 @@ class SyncedFileStateContract implements BaseColumns{ static final String LAST_ETAG = "last_etag"; static final String LOCAL_LAST_MODIFIED = "local_last_modified"; static final String SYNCEDFOLDER_ID = "synced_folder_id"; static final String IS_MEDIA_TYPE = "is_media_type"; static final String SQL_CREATE_TABLE_SYNCEDFILESTATE = "CREATE TABLE "+TABLE_NAME+" ( " Loading @@ -36,6 +35,7 @@ class SyncedFileStateContract implements BaseColumns{ +LAST_ETAG+" TEXT, " +LOCAL_LAST_MODIFIED+" INTEGER, " + SYNCEDFOLDER_ID +" INTEGER, " +IS_MEDIA_TYPE+" BOOLEAN," +"CONSTRAINT synced_unicity_constraint UNIQUE (" +FILE_NAME+", " +LOCAL_PATH+", " Loading app/src/main/java/io/eelo/drive/database/SyncedFileStateDAO.java +59 −46 Original line number Diff line number Diff line Loading @@ -20,6 +20,15 @@ import java.util.ArrayList; import java.util.List; import io.eelo.drive.models.SyncedFileState; import static io.eelo.drive.database.SyncedFileStateContract.TABLE_NAME; import static io.eelo.drive.database.SyncedFileStateContract.FILE_NAME; import static io.eelo.drive.database.SyncedFileStateContract.IS_MEDIA_TYPE; import static io.eelo.drive.database.SyncedFileStateContract.LAST_ETAG; import static io.eelo.drive.database.SyncedFileStateContract.LOCAL_LAST_MODIFIED; import static io.eelo.drive.database.SyncedFileStateContract.LOCAL_PATH; import static io.eelo.drive.database.SyncedFileStateContract.REMOTE_PATH; import static io.eelo.drive.database.SyncedFileStateContract.SYNCEDFOLDER_ID; /** * @author Vincent Bourgmayer Loading @@ -37,7 +46,8 @@ class SyncedFileStateDAO { SyncedFileStateContract.LAST_ETAG, SyncedFileStateContract.LOCAL_LAST_MODIFIED, SyncedFileStateContract.SYNCEDFOLDER_ID SyncedFileStateContract.SYNCEDFOLDER_ID, SyncedFileStateContract.IS_MEDIA_TYPE };*/ SyncedFileStateDAO(Context context){ Loading @@ -60,21 +70,33 @@ class SyncedFileStateDAO { mHelper.close(); } /** * Convert a SyncedFileState into a ContentValues object * @param syncedFileState syncedFileState to convert * @return a ContentValues object */ private ContentValues toContentValues(SyncedFileState syncedFileState){ ContentValues values = new ContentValues(); values.put( FILE_NAME, syncedFileState.getName() ); values.put( LOCAL_PATH, syncedFileState.getLocalPath() ); values.put( REMOTE_PATH, syncedFileState.getRemotePath() ); values.put( LAST_ETAG, syncedFileState.getLastETAG() ); values.put( LOCAL_LAST_MODIFIED, syncedFileState.getLocalLastModified() ); values.put( SYNCEDFOLDER_ID, syncedFileState.getSyncedFolderId() ); values.put( IS_MEDIA_TYPE, syncedFileState.isMediaType() ? 1 : 0 ); return values; } /** * Insert new SyncedFileState * @param syncedFileState element to register * @return id of the last added element */ long insert(SyncedFileState syncedFileState){ ContentValues values = new ContentValues(); values.put( SyncedFileStateContract.FILE_NAME, syncedFileState.getName() ); values.put( SyncedFileStateContract.LOCAL_PATH, syncedFileState.getLocalPath() ); values.put( SyncedFileStateContract.REMOTE_PATH, syncedFileState.getRemotePath() ); values.put( SyncedFileStateContract.LAST_ETAG, syncedFileState.getLastETAG() ); values.put( SyncedFileStateContract.LOCAL_LAST_MODIFIED, syncedFileState.getLocalLastModified() ); values.put( SyncedFileStateContract.SYNCEDFOLDER_ID, syncedFileState.getSyncedFolderId() ); return mDB.insertWithOnConflict(SyncedFileStateContract.TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_IGNORE); return mDB.insertWithOnConflict(SyncedFileStateContract.TABLE_NAME, null, toContentValues(syncedFileState), SQLiteDatabase.CONFLICT_IGNORE); } /** Loading @@ -92,17 +114,9 @@ class SyncedFileStateDAO { * @return number of row affected */ public int deleteByFolder(long folderId) { return mDB.delete(SyncedFileStateContract.TABLE_NAME, SyncedFileStateContract.SYNCEDFOLDER_ID return mDB.delete(TABLE_NAME, SYNCEDFOLDER_ID + " = " + folderId, null); } /** * Not used actually * Delete all rows * @return number of row affected */ /*public int deleteAll(){ return mDB.delete(SyncedFileStateContract.TABLE_NAME, null, null); } */ /** * Update a specific syncedFile Loading @@ -110,17 +124,12 @@ class SyncedFileStateDAO { * @return number of row affected */ int update(SyncedFileState syncedFileState){ ContentValues values = new ContentValues(); values.put(SyncedFileStateContract.FILE_NAME, syncedFileState.getName()); values.put(SyncedFileStateContract.LOCAL_PATH, syncedFileState.getLocalPath()); values.put(SyncedFileStateContract.REMOTE_PATH, syncedFileState.getRemotePath()); values.put(SyncedFileStateContract.LAST_ETAG, syncedFileState.getLastETAG()); values.put( SyncedFileStateContract.LOCAL_LAST_MODIFIED, syncedFileState.getLocalLastModified() ); values.put( SyncedFileStateContract.SYNCEDFOLDER_ID, syncedFileState.getSyncedFolderId() ); int result = 0; try{ result = mDB.update(SyncedFileStateContract.TABLE_NAME, values, SyncedFileStateContract._ID+" = "+syncedFileState.getId(), null); result = mDB.update(TABLE_NAME, toContentValues(syncedFileState), SyncedFileStateContract._ID+" = "+syncedFileState.getId(), null); }catch(Exception e){ Log.e(TAG, e.toString()); } Loading @@ -136,19 +145,20 @@ class SyncedFileStateDAO { List<SyncedFileState> getBySyncedFolderID(List<Long> syncedFolderids){ String query = "Select " +SyncedFileStateContract._ID+", " +SyncedFileStateContract.FILE_NAME+", " +SyncedFileStateContract.LOCAL_PATH+", " +SyncedFileStateContract.REMOTE_PATH+", " +SyncedFileStateContract.LAST_ETAG+", " +SyncedFileStateContract.LOCAL_LAST_MODIFIED+", " +SyncedFileStateContract.SYNCEDFOLDER_ID +FILE_NAME+", " +LOCAL_PATH+", " +REMOTE_PATH+", " +LAST_ETAG+", " +LOCAL_LAST_MODIFIED+", " + SYNCEDFOLDER_ID+", " + IS_MEDIA_TYPE +" FROM " +SyncedFileStateContract.TABLE_NAME; +TABLE_NAME; if(syncedFolderids.size() > 0) { query+=" WHERE "; for (int i = -1, idsSize = syncedFolderids.size(); ++i < idsSize; ) { query += SyncedFileStateContract.SYNCEDFOLDER_ID + " = " + syncedFolderids.get(i); query += SYNCEDFOLDER_ID + " = " + syncedFolderids.get(i); if (i < idsSize - 1) { query += " OR "; } Loading @@ -174,17 +184,19 @@ class SyncedFileStateDAO { SyncedFileState getByPath(String path, boolean isLocalPath){ String query = "Select " +SyncedFileStateContract._ID+", " +SyncedFileStateContract.FILE_NAME+", " +SyncedFileStateContract.LOCAL_PATH+", " +SyncedFileStateContract.REMOTE_PATH+", " +SyncedFileStateContract.LAST_ETAG+", " +SyncedFileStateContract.LOCAL_LAST_MODIFIED+", " +SyncedFileStateContract.SYNCEDFOLDER_ID+" FROM " +SyncedFileStateContract.TABLE_NAME+" WHERE "; +FILE_NAME+", " +LOCAL_PATH+", " +REMOTE_PATH+", " +LAST_ETAG+", " +LOCAL_LAST_MODIFIED+", " + SYNCEDFOLDER_ID+", " + IS_MEDIA_TYPE+ " FROM " +TABLE_NAME+" WHERE "; if(isLocalPath) query+=SyncedFileStateContract.LOCAL_PATH ; query+=LOCAL_PATH ; else query+=SyncedFileStateContract.REMOTE_PATH ; query+=REMOTE_PATH ; query +=" like \""+path+"\""; Loading @@ -211,7 +223,8 @@ class SyncedFileStateDAO { cursor.getString(3 ),//remote path cursor.getString(4 ),// last Etag cursor.getLong(5 ),//Local last modified cursor.getLong(6 ) //SyncedFolderID cursor.getLong(6 ), //SyncedFolderID (cursor.getInt(7) == 1 ) //is Media Type ); } } app/src/main/java/io/eelo/drive/database/SyncedFolderContract.java +3 −1 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ final class SyncedFolderContract implements BaseColumns{ static final String SCANLOCAL ="scan_local"; static final String SCANREMOTE ="scan_remote"; static final String ENABLED ="enabled"; static final String IS_MEDIA_TYPE = "is_media_type"; static final String SQL_CREATE_TABLE_SYNCEDFOLDER = "CREATE TABLE "+TABLE_NAME+" ( " Loading @@ -38,7 +39,8 @@ final class SyncedFolderContract implements BaseColumns{ +LOCAL_LAST_MODIFIED+" INTEGER, " +SCANLOCAL+" BOOLEAN, " +SCANREMOTE+" BOOLEAN, " +ENABLED+" BOOLEAN ) "; +ENABLED+" BOOLEAN, " +IS_MEDIA_TYPE+" BOOLEAN ) "; static final String SQL_DELETE_TABLE_SYNCEDFOLDER = " DROP TABLE IF EXISTS " + TABLE_NAME; Loading app/src/main/java/io/eelo/drive/database/SyncedFolderDAO.java +64 −63 Original line number Diff line number Diff line Loading @@ -14,29 +14,40 @@ import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import java.util.ArrayList; import java.util.List; import io.eelo.drive.models.SyncedFolder; import static io.eelo.drive.database.SyncedFolderContract.CATEGORIE_LABEL; import static io.eelo.drive.database.SyncedFolderContract.ENABLED; import static io.eelo.drive.database.SyncedFolderContract.LAST_ETAG; import static io.eelo.drive.database.SyncedFolderContract.LOCAL_LAST_MODIFIED; import static io.eelo.drive.database.SyncedFolderContract.LOCAL_PATH; import static io.eelo.drive.database.SyncedFolderContract.REMOTE_PATH; import static io.eelo.drive.database.SyncedFolderContract.SCANLOCAL; import static io.eelo.drive.database.SyncedFolderContract.SCANREMOTE; import static io.eelo.drive.database.SyncedFolderContract.IS_MEDIA_TYPE; import static io.eelo.drive.database.SyncedFolderContract.TABLE_NAME; /** * @author Vincent Bourgmayer * source: https://vogella.developpez.com/tutoriels/android/utilisation-base-donnees-sqlite/ * Source: https://vogella.developpez.com/tutoriels/android/utilisation-base-donnees-sqlite/ */ class SyncedFolderDAO { final private static String TAG = SyncedFolderDAO.class.getSimpleName(); //Tag for log private SQLiteDatabase mDB; private final DbHelper mHelper; private final String[] allColumns = { SyncedFolderContract._ID, SyncedFolderContract.CATEGORIE_LABEL, SyncedFolderContract.LOCAL_PATH, SyncedFolderContract.REMOTE_PATH, SyncedFolderContract.LAST_ETAG, SyncedFolderContract.LOCAL_LAST_MODIFIED, SyncedFolderContract.SCANLOCAL, SyncedFolderContract.SCANREMOTE, SyncedFolderContract.ENABLED}; CATEGORIE_LABEL, LOCAL_PATH, REMOTE_PATH, LAST_ETAG, LOCAL_LAST_MODIFIED, SCANLOCAL, SCANREMOTE, ENABLED, IS_MEDIA_TYPE }; SyncedFolderDAO(Context context){ this.mHelper = new DbHelper(context); Loading @@ -58,22 +69,34 @@ class SyncedFolderDAO { mHelper.close(); } /** * Convert a syncedFolder to ContentValues * @param syncedFolder SyncedFolder to convert * @return ContentValues object */ private ContentValues toContentValues(SyncedFolder syncedFolder){ ContentValues values = new ContentValues(); values.put( CATEGORIE_LABEL, syncedFolder.getLibelle() ); values.put( LOCAL_PATH, syncedFolder.getLocalFolder() ); values.put( REMOTE_PATH, syncedFolder.getRemoteFolder() ); values.put( LAST_ETAG, syncedFolder.getLastEtag() ); values.put( LOCAL_LAST_MODIFIED, syncedFolder.getLastEtag() ); values.put( SCANLOCAL, syncedFolder.isScanLocal() ? 1 : 0 ); values.put( SCANREMOTE, syncedFolder.isScanRemote() ? 1 : 0 ); values.put( ENABLED, syncedFolder.isEnabled() ? 1 : 0 ); values.put( IS_MEDIA_TYPE, syncedFolder.isMediaType() ? 1 : 0 ); return values; } /** * Insert new syncedFolder * @param syncedFolder element to register * @return Id of the last inserted value */ long insert(SyncedFolder syncedFolder){ ContentValues values = new ContentValues(); values.put( SyncedFolderContract.CATEGORIE_LABEL, syncedFolder.getLibelle() ); values.put( SyncedFolderContract.LOCAL_PATH, syncedFolder.getLocalFolder() ); values.put( SyncedFolderContract.REMOTE_PATH, syncedFolder.getRemoteFolder() ); values.put( SyncedFolderContract.LAST_ETAG, syncedFolder.getLastEtag() ); values.put( SyncedFolderContract.LOCAL_LAST_MODIFIED, syncedFolder.getLastEtag() ); values.put( SyncedFolderContract.SCANLOCAL, syncedFolder.isScanLocal() ? 1 : 0 ); values.put( SyncedFolderContract.SCANREMOTE, syncedFolder.isScanRemote() ? 1 : 0 ); values.put( SyncedFolderContract.ENABLED, syncedFolder.isEnabled() ? 1 : 0 ); return mDB.insertWithOnConflict(SyncedFolderContract.TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_IGNORE); return mDB.insertWithOnConflict(TABLE_NAME, null, toContentValues(syncedFolder), SQLiteDatabase.CONFLICT_IGNORE); } /** Loading @@ -81,38 +104,20 @@ class SyncedFolderDAO { * @param id syncedFolder's id */ public int delete(long id) { return mDB.delete(SyncedFolderContract.TABLE_NAME, SyncedFolderContract._ID return mDB.delete(TABLE_NAME, SyncedFolderContract._ID + " = " + id, null); } /** * Delete all syncedFolder */ /* public void delete() { mDB.delete(syncedFolderContract.TABLE_NAME, null, null); } */ /** * Update a specific syncedFolder * @param syncedFolder syncedFolder to update * @return Number of row affected */ public int update(SyncedFolder syncedFolder){ ContentValues values = new ContentValues(); values.put(SyncedFolderContract.CATEGORIE_LABEL, syncedFolder.getLibelle()); values.put(SyncedFolderContract.LOCAL_PATH, syncedFolder.getLocalFolder()); values.put(SyncedFolderContract.REMOTE_PATH, syncedFolder.getRemoteFolder()); values.put(SyncedFolderContract.LAST_ETAG, syncedFolder.getLastEtag()); values.put( SyncedFolderContract.LOCAL_LAST_MODIFIED, syncedFolder.getLastModified() ); values.put(SyncedFolderContract.SCANLOCAL, syncedFolder.isScanLocal() ? 1 : 0); values.put(SyncedFolderContract.SCANREMOTE, syncedFolder.isScanRemote() ? 1 : 0); values.put( SyncedFolderContract.ENABLED, syncedFolder.isEnabled()? 1 : 0 ); int result = 0; try{ result = mDB.update(SyncedFolderContract.TABLE_NAME, values, result = mDB.update(TABLE_NAME, toContentValues(syncedFolder), SyncedFolderContract._ID+" = "+ syncedFolder.getId(), null); }catch(Exception e){ Loading @@ -127,21 +132,15 @@ class SyncedFolderDAO { * @param selection if true, return all enabled syncedFolder, if false return all disabled syncedFolder * @return List of all syncedFolder */ List<SyncedFolder> getAllSyncedFolders(String selection) { List<SyncedFolder> getSyncedFolderList(String selection, String[] args) { Log.i(TAG, "getSyncedFolderList("+selection+", "+args+")"); List<SyncedFolder> syncedFolders = new ArrayList<SyncedFolder>(); String[] args = {"1"}; if(selection.isEmpty()){ selection = null; args = null; }else{ selection += " = ?"; } Cursor cursor = mDB.query(SyncedFolderContract.TABLE_NAME, allColumns, selection,args, null, null, null); Cursor cursor = mDB.query(TABLE_NAME, allColumns, selection,args, null, null, null); cursor.moveToFirst(); while ( !cursor.isAfterLast() ) { SyncedFolder syncedFolder = cursorToSyncedFolder(cursor); if(syncedFolder == null ){ Loading @@ -163,10 +162,10 @@ class SyncedFolderDAO { */ int reduceLastModifiedValue(int syncFolderID) { ContentValues values = new ContentValues(); values.put( SyncedFolderContract.LOCAL_LAST_MODIFIED, 1 ); values.put( LOCAL_LAST_MODIFIED, 1 ); int result = 0; try{ result = mDB.update(SyncedFolderContract.TABLE_NAME, values, result = mDB.update(TABLE_NAME, values, SyncedFolderContract._ID+" = "+ syncFolderID, null); }catch(Exception e){ Loading @@ -181,15 +180,17 @@ class SyncedFolderDAO { * @return syncedFolder instance build with data in the cursor */ private SyncedFolder cursorToSyncedFolder(Cursor cursor) { return new SyncedFolder() return new SyncedFolder(cursor.getString(1), //libelle cursor.getString(2), //localFOlder cursor.getString(3), //remoteFolder ( cursor.getInt(6) == 1 ),//scanLocal ( cursor.getInt(7) == 1 ),//scanRemote ( cursor.getInt(8) == 1 ), //isEnabled ( cursor.getInt(9) == 1 ) //is Media Type )//active .setId(cursor.getInt(0) ) .setLibelle(cursor.getString(1) ) .setLocalFolder(cursor.getString(2) ) .setRemoteFolder(cursor.getString(3) ) .setLastEtag(cursor.getString( 4 ) ) .setLastModified(cursor.getLong( 5 ) ) .setScanLocal( cursor.getInt(6) == 1 ) .setScanRemote( cursor.getInt(7) == 1 ) .setEnabled( cursor.getInt(8) == 1 ); .setLastModified(cursor.getLong( 5 ) ); } } Loading
app/src/main/java/io/eelo/drive/database/DbHelper.java +19 −19 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ import io.eelo.drive.models.SyncedFileState; public final class DbHelper extends SQLiteOpenHelper { final private static String TAG = DbHelper.class.getSimpleName(); //Tag for log private static final int DATABASE_VERSION = 14; private static final int DATABASE_VERSION = 19; public static final String DATABASE_NAME = "eelo_drive.db"; /** Loading Loading @@ -177,13 +177,29 @@ public final class DbHelper extends SQLiteOpenHelper { * @param context app or service activity * @return List<Folder> a list of SyncedFolder from DB */ public static List<SyncedFolder> getSyncedFolders(Context context) { public static List<SyncedFolder> getAllSyncedFolders(Context context) { SyncedFolderDAO dao = openSyncedFolderDAO(context, false); List<SyncedFolder> mSyncedFolder = new ArrayList<SyncedFolder>(); if(dao == null){ return mSyncedFolder; }else { mSyncedFolder = dao.getAllSyncedFolders(SyncedFolderContract.ENABLED); mSyncedFolder = dao.getSyncedFolderList(SyncedFolderContract.ENABLED+" = 1 ", null ); dao.close(); return mSyncedFolder; } } public static List<SyncedFolder> getSyncedFolderList(Context context, boolean isMediaType) { SyncedFolderDAO dao = openSyncedFolderDAO(context, false); List<SyncedFolder> mSyncedFolder = new ArrayList<>(); if(dao == null){ return mSyncedFolder; } else { mSyncedFolder = dao.getSyncedFolderList(SyncedFolderContract.ENABLED+" = 1 AND " +SyncedFolderContract.IS_MEDIA_TYPE+" = ?", new String[] {(isMediaType)? "1":"0"} ); dao.close(); return mSyncedFolder; } Loading Loading @@ -222,22 +238,6 @@ public final class DbHelper extends SQLiteOpenHelper { return result; } /** * Delete a syncedFolder and its relative SyncedFileState * @param id Id of the syncedFolder to remove * @param context context to use * @return */ public static int deleteSyncedFolderAndSyncedFileStates(long id, Context context){ SyncedFileStateDAO dao = openSyncedFileStateDAO(context, true); if(dao == null){ return -1; } int result = dao.deleteByFolder(id); dao.close(); return result+deleteSyncedFolder(id, context); } /** * Set the lastModified value of SyncedFolder to 1. * The goal is to force to rescan it next time. Loading
app/src/main/java/io/eelo/drive/database/SyncedFileStateContract.java +2 −2 Original line number Diff line number Diff line Loading @@ -17,8 +17,6 @@ import android.provider.BaseColumns; class SyncedFileStateContract implements BaseColumns{ /** Table structure **/ static final String TABLE_NAME ="synced_file_state"; static final String FILE_NAME ="file_name"; static final String LOCAL_PATH ="local_path"; Loading @@ -26,6 +24,7 @@ class SyncedFileStateContract implements BaseColumns{ static final String LAST_ETAG = "last_etag"; static final String LOCAL_LAST_MODIFIED = "local_last_modified"; static final String SYNCEDFOLDER_ID = "synced_folder_id"; static final String IS_MEDIA_TYPE = "is_media_type"; static final String SQL_CREATE_TABLE_SYNCEDFILESTATE = "CREATE TABLE "+TABLE_NAME+" ( " Loading @@ -36,6 +35,7 @@ class SyncedFileStateContract implements BaseColumns{ +LAST_ETAG+" TEXT, " +LOCAL_LAST_MODIFIED+" INTEGER, " + SYNCEDFOLDER_ID +" INTEGER, " +IS_MEDIA_TYPE+" BOOLEAN," +"CONSTRAINT synced_unicity_constraint UNIQUE (" +FILE_NAME+", " +LOCAL_PATH+", " Loading
app/src/main/java/io/eelo/drive/database/SyncedFileStateDAO.java +59 −46 Original line number Diff line number Diff line Loading @@ -20,6 +20,15 @@ import java.util.ArrayList; import java.util.List; import io.eelo.drive.models.SyncedFileState; import static io.eelo.drive.database.SyncedFileStateContract.TABLE_NAME; import static io.eelo.drive.database.SyncedFileStateContract.FILE_NAME; import static io.eelo.drive.database.SyncedFileStateContract.IS_MEDIA_TYPE; import static io.eelo.drive.database.SyncedFileStateContract.LAST_ETAG; import static io.eelo.drive.database.SyncedFileStateContract.LOCAL_LAST_MODIFIED; import static io.eelo.drive.database.SyncedFileStateContract.LOCAL_PATH; import static io.eelo.drive.database.SyncedFileStateContract.REMOTE_PATH; import static io.eelo.drive.database.SyncedFileStateContract.SYNCEDFOLDER_ID; /** * @author Vincent Bourgmayer Loading @@ -37,7 +46,8 @@ class SyncedFileStateDAO { SyncedFileStateContract.LAST_ETAG, SyncedFileStateContract.LOCAL_LAST_MODIFIED, SyncedFileStateContract.SYNCEDFOLDER_ID SyncedFileStateContract.SYNCEDFOLDER_ID, SyncedFileStateContract.IS_MEDIA_TYPE };*/ SyncedFileStateDAO(Context context){ Loading @@ -60,21 +70,33 @@ class SyncedFileStateDAO { mHelper.close(); } /** * Convert a SyncedFileState into a ContentValues object * @param syncedFileState syncedFileState to convert * @return a ContentValues object */ private ContentValues toContentValues(SyncedFileState syncedFileState){ ContentValues values = new ContentValues(); values.put( FILE_NAME, syncedFileState.getName() ); values.put( LOCAL_PATH, syncedFileState.getLocalPath() ); values.put( REMOTE_PATH, syncedFileState.getRemotePath() ); values.put( LAST_ETAG, syncedFileState.getLastETAG() ); values.put( LOCAL_LAST_MODIFIED, syncedFileState.getLocalLastModified() ); values.put( SYNCEDFOLDER_ID, syncedFileState.getSyncedFolderId() ); values.put( IS_MEDIA_TYPE, syncedFileState.isMediaType() ? 1 : 0 ); return values; } /** * Insert new SyncedFileState * @param syncedFileState element to register * @return id of the last added element */ long insert(SyncedFileState syncedFileState){ ContentValues values = new ContentValues(); values.put( SyncedFileStateContract.FILE_NAME, syncedFileState.getName() ); values.put( SyncedFileStateContract.LOCAL_PATH, syncedFileState.getLocalPath() ); values.put( SyncedFileStateContract.REMOTE_PATH, syncedFileState.getRemotePath() ); values.put( SyncedFileStateContract.LAST_ETAG, syncedFileState.getLastETAG() ); values.put( SyncedFileStateContract.LOCAL_LAST_MODIFIED, syncedFileState.getLocalLastModified() ); values.put( SyncedFileStateContract.SYNCEDFOLDER_ID, syncedFileState.getSyncedFolderId() ); return mDB.insertWithOnConflict(SyncedFileStateContract.TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_IGNORE); return mDB.insertWithOnConflict(SyncedFileStateContract.TABLE_NAME, null, toContentValues(syncedFileState), SQLiteDatabase.CONFLICT_IGNORE); } /** Loading @@ -92,17 +114,9 @@ class SyncedFileStateDAO { * @return number of row affected */ public int deleteByFolder(long folderId) { return mDB.delete(SyncedFileStateContract.TABLE_NAME, SyncedFileStateContract.SYNCEDFOLDER_ID return mDB.delete(TABLE_NAME, SYNCEDFOLDER_ID + " = " + folderId, null); } /** * Not used actually * Delete all rows * @return number of row affected */ /*public int deleteAll(){ return mDB.delete(SyncedFileStateContract.TABLE_NAME, null, null); } */ /** * Update a specific syncedFile Loading @@ -110,17 +124,12 @@ class SyncedFileStateDAO { * @return number of row affected */ int update(SyncedFileState syncedFileState){ ContentValues values = new ContentValues(); values.put(SyncedFileStateContract.FILE_NAME, syncedFileState.getName()); values.put(SyncedFileStateContract.LOCAL_PATH, syncedFileState.getLocalPath()); values.put(SyncedFileStateContract.REMOTE_PATH, syncedFileState.getRemotePath()); values.put(SyncedFileStateContract.LAST_ETAG, syncedFileState.getLastETAG()); values.put( SyncedFileStateContract.LOCAL_LAST_MODIFIED, syncedFileState.getLocalLastModified() ); values.put( SyncedFileStateContract.SYNCEDFOLDER_ID, syncedFileState.getSyncedFolderId() ); int result = 0; try{ result = mDB.update(SyncedFileStateContract.TABLE_NAME, values, SyncedFileStateContract._ID+" = "+syncedFileState.getId(), null); result = mDB.update(TABLE_NAME, toContentValues(syncedFileState), SyncedFileStateContract._ID+" = "+syncedFileState.getId(), null); }catch(Exception e){ Log.e(TAG, e.toString()); } Loading @@ -136,19 +145,20 @@ class SyncedFileStateDAO { List<SyncedFileState> getBySyncedFolderID(List<Long> syncedFolderids){ String query = "Select " +SyncedFileStateContract._ID+", " +SyncedFileStateContract.FILE_NAME+", " +SyncedFileStateContract.LOCAL_PATH+", " +SyncedFileStateContract.REMOTE_PATH+", " +SyncedFileStateContract.LAST_ETAG+", " +SyncedFileStateContract.LOCAL_LAST_MODIFIED+", " +SyncedFileStateContract.SYNCEDFOLDER_ID +FILE_NAME+", " +LOCAL_PATH+", " +REMOTE_PATH+", " +LAST_ETAG+", " +LOCAL_LAST_MODIFIED+", " + SYNCEDFOLDER_ID+", " + IS_MEDIA_TYPE +" FROM " +SyncedFileStateContract.TABLE_NAME; +TABLE_NAME; if(syncedFolderids.size() > 0) { query+=" WHERE "; for (int i = -1, idsSize = syncedFolderids.size(); ++i < idsSize; ) { query += SyncedFileStateContract.SYNCEDFOLDER_ID + " = " + syncedFolderids.get(i); query += SYNCEDFOLDER_ID + " = " + syncedFolderids.get(i); if (i < idsSize - 1) { query += " OR "; } Loading @@ -174,17 +184,19 @@ class SyncedFileStateDAO { SyncedFileState getByPath(String path, boolean isLocalPath){ String query = "Select " +SyncedFileStateContract._ID+", " +SyncedFileStateContract.FILE_NAME+", " +SyncedFileStateContract.LOCAL_PATH+", " +SyncedFileStateContract.REMOTE_PATH+", " +SyncedFileStateContract.LAST_ETAG+", " +SyncedFileStateContract.LOCAL_LAST_MODIFIED+", " +SyncedFileStateContract.SYNCEDFOLDER_ID+" FROM " +SyncedFileStateContract.TABLE_NAME+" WHERE "; +FILE_NAME+", " +LOCAL_PATH+", " +REMOTE_PATH+", " +LAST_ETAG+", " +LOCAL_LAST_MODIFIED+", " + SYNCEDFOLDER_ID+", " + IS_MEDIA_TYPE+ " FROM " +TABLE_NAME+" WHERE "; if(isLocalPath) query+=SyncedFileStateContract.LOCAL_PATH ; query+=LOCAL_PATH ; else query+=SyncedFileStateContract.REMOTE_PATH ; query+=REMOTE_PATH ; query +=" like \""+path+"\""; Loading @@ -211,7 +223,8 @@ class SyncedFileStateDAO { cursor.getString(3 ),//remote path cursor.getString(4 ),// last Etag cursor.getLong(5 ),//Local last modified cursor.getLong(6 ) //SyncedFolderID cursor.getLong(6 ), //SyncedFolderID (cursor.getInt(7) == 1 ) //is Media Type ); } }
app/src/main/java/io/eelo/drive/database/SyncedFolderContract.java +3 −1 Original line number Diff line number Diff line Loading @@ -27,6 +27,7 @@ final class SyncedFolderContract implements BaseColumns{ static final String SCANLOCAL ="scan_local"; static final String SCANREMOTE ="scan_remote"; static final String ENABLED ="enabled"; static final String IS_MEDIA_TYPE = "is_media_type"; static final String SQL_CREATE_TABLE_SYNCEDFOLDER = "CREATE TABLE "+TABLE_NAME+" ( " Loading @@ -38,7 +39,8 @@ final class SyncedFolderContract implements BaseColumns{ +LOCAL_LAST_MODIFIED+" INTEGER, " +SCANLOCAL+" BOOLEAN, " +SCANREMOTE+" BOOLEAN, " +ENABLED+" BOOLEAN ) "; +ENABLED+" BOOLEAN, " +IS_MEDIA_TYPE+" BOOLEAN ) "; static final String SQL_DELETE_TABLE_SYNCEDFOLDER = " DROP TABLE IF EXISTS " + TABLE_NAME; Loading
app/src/main/java/io/eelo/drive/database/SyncedFolderDAO.java +64 −63 Original line number Diff line number Diff line Loading @@ -14,29 +14,40 @@ import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import java.util.ArrayList; import java.util.List; import io.eelo.drive.models.SyncedFolder; import static io.eelo.drive.database.SyncedFolderContract.CATEGORIE_LABEL; import static io.eelo.drive.database.SyncedFolderContract.ENABLED; import static io.eelo.drive.database.SyncedFolderContract.LAST_ETAG; import static io.eelo.drive.database.SyncedFolderContract.LOCAL_LAST_MODIFIED; import static io.eelo.drive.database.SyncedFolderContract.LOCAL_PATH; import static io.eelo.drive.database.SyncedFolderContract.REMOTE_PATH; import static io.eelo.drive.database.SyncedFolderContract.SCANLOCAL; import static io.eelo.drive.database.SyncedFolderContract.SCANREMOTE; import static io.eelo.drive.database.SyncedFolderContract.IS_MEDIA_TYPE; import static io.eelo.drive.database.SyncedFolderContract.TABLE_NAME; /** * @author Vincent Bourgmayer * source: https://vogella.developpez.com/tutoriels/android/utilisation-base-donnees-sqlite/ * Source: https://vogella.developpez.com/tutoriels/android/utilisation-base-donnees-sqlite/ */ class SyncedFolderDAO { final private static String TAG = SyncedFolderDAO.class.getSimpleName(); //Tag for log private SQLiteDatabase mDB; private final DbHelper mHelper; private final String[] allColumns = { SyncedFolderContract._ID, SyncedFolderContract.CATEGORIE_LABEL, SyncedFolderContract.LOCAL_PATH, SyncedFolderContract.REMOTE_PATH, SyncedFolderContract.LAST_ETAG, SyncedFolderContract.LOCAL_LAST_MODIFIED, SyncedFolderContract.SCANLOCAL, SyncedFolderContract.SCANREMOTE, SyncedFolderContract.ENABLED}; CATEGORIE_LABEL, LOCAL_PATH, REMOTE_PATH, LAST_ETAG, LOCAL_LAST_MODIFIED, SCANLOCAL, SCANREMOTE, ENABLED, IS_MEDIA_TYPE }; SyncedFolderDAO(Context context){ this.mHelper = new DbHelper(context); Loading @@ -58,22 +69,34 @@ class SyncedFolderDAO { mHelper.close(); } /** * Convert a syncedFolder to ContentValues * @param syncedFolder SyncedFolder to convert * @return ContentValues object */ private ContentValues toContentValues(SyncedFolder syncedFolder){ ContentValues values = new ContentValues(); values.put( CATEGORIE_LABEL, syncedFolder.getLibelle() ); values.put( LOCAL_PATH, syncedFolder.getLocalFolder() ); values.put( REMOTE_PATH, syncedFolder.getRemoteFolder() ); values.put( LAST_ETAG, syncedFolder.getLastEtag() ); values.put( LOCAL_LAST_MODIFIED, syncedFolder.getLastEtag() ); values.put( SCANLOCAL, syncedFolder.isScanLocal() ? 1 : 0 ); values.put( SCANREMOTE, syncedFolder.isScanRemote() ? 1 : 0 ); values.put( ENABLED, syncedFolder.isEnabled() ? 1 : 0 ); values.put( IS_MEDIA_TYPE, syncedFolder.isMediaType() ? 1 : 0 ); return values; } /** * Insert new syncedFolder * @param syncedFolder element to register * @return Id of the last inserted value */ long insert(SyncedFolder syncedFolder){ ContentValues values = new ContentValues(); values.put( SyncedFolderContract.CATEGORIE_LABEL, syncedFolder.getLibelle() ); values.put( SyncedFolderContract.LOCAL_PATH, syncedFolder.getLocalFolder() ); values.put( SyncedFolderContract.REMOTE_PATH, syncedFolder.getRemoteFolder() ); values.put( SyncedFolderContract.LAST_ETAG, syncedFolder.getLastEtag() ); values.put( SyncedFolderContract.LOCAL_LAST_MODIFIED, syncedFolder.getLastEtag() ); values.put( SyncedFolderContract.SCANLOCAL, syncedFolder.isScanLocal() ? 1 : 0 ); values.put( SyncedFolderContract.SCANREMOTE, syncedFolder.isScanRemote() ? 1 : 0 ); values.put( SyncedFolderContract.ENABLED, syncedFolder.isEnabled() ? 1 : 0 ); return mDB.insertWithOnConflict(SyncedFolderContract.TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_IGNORE); return mDB.insertWithOnConflict(TABLE_NAME, null, toContentValues(syncedFolder), SQLiteDatabase.CONFLICT_IGNORE); } /** Loading @@ -81,38 +104,20 @@ class SyncedFolderDAO { * @param id syncedFolder's id */ public int delete(long id) { return mDB.delete(SyncedFolderContract.TABLE_NAME, SyncedFolderContract._ID return mDB.delete(TABLE_NAME, SyncedFolderContract._ID + " = " + id, null); } /** * Delete all syncedFolder */ /* public void delete() { mDB.delete(syncedFolderContract.TABLE_NAME, null, null); } */ /** * Update a specific syncedFolder * @param syncedFolder syncedFolder to update * @return Number of row affected */ public int update(SyncedFolder syncedFolder){ ContentValues values = new ContentValues(); values.put(SyncedFolderContract.CATEGORIE_LABEL, syncedFolder.getLibelle()); values.put(SyncedFolderContract.LOCAL_PATH, syncedFolder.getLocalFolder()); values.put(SyncedFolderContract.REMOTE_PATH, syncedFolder.getRemoteFolder()); values.put(SyncedFolderContract.LAST_ETAG, syncedFolder.getLastEtag()); values.put( SyncedFolderContract.LOCAL_LAST_MODIFIED, syncedFolder.getLastModified() ); values.put(SyncedFolderContract.SCANLOCAL, syncedFolder.isScanLocal() ? 1 : 0); values.put(SyncedFolderContract.SCANREMOTE, syncedFolder.isScanRemote() ? 1 : 0); values.put( SyncedFolderContract.ENABLED, syncedFolder.isEnabled()? 1 : 0 ); int result = 0; try{ result = mDB.update(SyncedFolderContract.TABLE_NAME, values, result = mDB.update(TABLE_NAME, toContentValues(syncedFolder), SyncedFolderContract._ID+" = "+ syncedFolder.getId(), null); }catch(Exception e){ Loading @@ -127,21 +132,15 @@ class SyncedFolderDAO { * @param selection if true, return all enabled syncedFolder, if false return all disabled syncedFolder * @return List of all syncedFolder */ List<SyncedFolder> getAllSyncedFolders(String selection) { List<SyncedFolder> getSyncedFolderList(String selection, String[] args) { Log.i(TAG, "getSyncedFolderList("+selection+", "+args+")"); List<SyncedFolder> syncedFolders = new ArrayList<SyncedFolder>(); String[] args = {"1"}; if(selection.isEmpty()){ selection = null; args = null; }else{ selection += " = ?"; } Cursor cursor = mDB.query(SyncedFolderContract.TABLE_NAME, allColumns, selection,args, null, null, null); Cursor cursor = mDB.query(TABLE_NAME, allColumns, selection,args, null, null, null); cursor.moveToFirst(); while ( !cursor.isAfterLast() ) { SyncedFolder syncedFolder = cursorToSyncedFolder(cursor); if(syncedFolder == null ){ Loading @@ -163,10 +162,10 @@ class SyncedFolderDAO { */ int reduceLastModifiedValue(int syncFolderID) { ContentValues values = new ContentValues(); values.put( SyncedFolderContract.LOCAL_LAST_MODIFIED, 1 ); values.put( LOCAL_LAST_MODIFIED, 1 ); int result = 0; try{ result = mDB.update(SyncedFolderContract.TABLE_NAME, values, result = mDB.update(TABLE_NAME, values, SyncedFolderContract._ID+" = "+ syncFolderID, null); }catch(Exception e){ Loading @@ -181,15 +180,17 @@ class SyncedFolderDAO { * @return syncedFolder instance build with data in the cursor */ private SyncedFolder cursorToSyncedFolder(Cursor cursor) { return new SyncedFolder() return new SyncedFolder(cursor.getString(1), //libelle cursor.getString(2), //localFOlder cursor.getString(3), //remoteFolder ( cursor.getInt(6) == 1 ),//scanLocal ( cursor.getInt(7) == 1 ),//scanRemote ( cursor.getInt(8) == 1 ), //isEnabled ( cursor.getInt(9) == 1 ) //is Media Type )//active .setId(cursor.getInt(0) ) .setLibelle(cursor.getString(1) ) .setLocalFolder(cursor.getString(2) ) .setRemoteFolder(cursor.getString(3) ) .setLastEtag(cursor.getString( 4 ) ) .setLastModified(cursor.getLong( 5 ) ) .setScanLocal( cursor.getInt(6) == 1 ) .setScanRemote( cursor.getInt(7) == 1 ) .setEnabled( cursor.getInt(8) == 1 ); .setLastModified(cursor.getLong( 5 ) ); } }