database bug fix, moved query strings to DatabaseAdapter, added comments

This commit is contained in:
nuclearfog 2020-10-24 15:14:17 +02:00
parent 54baac22d0
commit c469b1f034
No known key found for this signature in database
GPG Key ID: D5490E4A81F97B14
2 changed files with 107 additions and 54 deletions

View File

@ -17,6 +17,18 @@ import java.util.List;
import static android.database.sqlite.SQLiteDatabase.CONFLICT_IGNORE; import static android.database.sqlite.SQLiteDatabase.CONFLICT_IGNORE;
import static android.database.sqlite.SQLiteDatabase.CONFLICT_REPLACE; import static android.database.sqlite.SQLiteDatabase.CONFLICT_REPLACE;
import static org.nuclearfog.twidda.database.DatabaseAdapter.ANSWER_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.HOMETL_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.MENTION_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.MESSAGE_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.SINGLE_TWEET_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.STATUS_EXIST_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.TREND_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.TWEETFLAG_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.USERFAVORIT_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.USERFLAG_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.USERTWEET_QUERY;
import static org.nuclearfog.twidda.database.DatabaseAdapter.USER_QUERY;
/** /**
* Connection Class to SQLite Database of the app * Connection Class to SQLite Database of the app
@ -183,14 +195,11 @@ public class AppDatabase {
* @return tweet list * @return tweet list
*/ */
public List<Tweet> getHomeTimeline() { public List<Tweet> getHomeTimeline() {
final String[] ARGS = new String[]{Integer.toString(HOM_MASK), Integer.toString(limit)}; String[] args = {Integer.toString(HOM_MASK), Integer.toString(limit)};
final String QUERY = "SELECT * FROM tweet INNER JOIN user ON tweet.userID=user.userID " +
"WHERE statusregister&? IS NOT 0 ORDER BY tweetID DESC LIMIT ?";
SQLiteDatabase db = getDbRead(); SQLiteDatabase db = getDbRead();
List<Tweet> tweetList = new LinkedList<>(); List<Tweet> tweetList = new LinkedList<>();
Cursor cursor = db.rawQuery(HOMETL_QUERY, args);
Cursor cursor = db.rawQuery(QUERY, ARGS);
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
do { do {
Tweet tweet = getStatus(cursor); Tweet tweet = getStatus(cursor);
@ -207,14 +216,11 @@ public class AppDatabase {
* @return tweet list * @return tweet list
*/ */
public List<Tweet> getMentions() { public List<Tweet> getMentions() {
final String[] ARGS = new String[]{Integer.toString(MEN_MASK), Integer.toString(EXCL_USR), Integer.toString(limit)}; String[] args = {Integer.toString(MEN_MASK), Integer.toString(EXCL_USR), Integer.toString(limit)};
final String QUERY = "SELECT * FROM tweet INNER JOIN user ON tweet.userID=user.userID " +
"WHERE statusregister&? IS NOT 0 AND userregister&? IS 0 ORDER BY tweetID DESC LIMIT ?";
SQLiteDatabase db = getDbRead(); SQLiteDatabase db = getDbRead();
List<Tweet> tweetList = new LinkedList<>(); List<Tweet> tweetList = new LinkedList<>();
Cursor cursor = db.rawQuery(MENTION_QUERY, args);
Cursor cursor = db.rawQuery(QUERY, ARGS);
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
do { do {
Tweet tweet = getStatus(cursor); Tweet tweet = getStatus(cursor);
@ -232,14 +238,11 @@ public class AppDatabase {
* @return Tweet list of user tweets * @return Tweet list of user tweets
*/ */
public List<Tweet> getUserTweets(long userID) { public List<Tweet> getUserTweets(long userID) {
final String[] ARGS = new String[]{Integer.toString(UTW_MASK), Long.toString(userID), Integer.toString(limit)}; String[] args = {Integer.toString(UTW_MASK), Long.toString(userID), Integer.toString(limit)};
final String QUERY = "SELECT * FROM tweet INNER JOIN user ON tweet.userID=user.userID " +
"WHERE statusregister&? IS NOT 0 AND user.userID=? ORDER BY tweetID DESC LIMIT ?";
SQLiteDatabase db = getDbRead(); SQLiteDatabase db = getDbRead();
List<Tweet> tweetList = new LinkedList<>(); List<Tweet> tweetList = new LinkedList<>();
Cursor cursor = db.rawQuery(USERTWEET_QUERY, args);
Cursor cursor = db.rawQuery(QUERY, ARGS);
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
do { do {
Tweet tweet = getStatus(cursor); Tweet tweet = getStatus(cursor);
@ -257,14 +260,11 @@ public class AppDatabase {
* @return favored tweets by user * @return favored tweets by user
*/ */
public List<Tweet> getUserFavs(long ownerID) { public List<Tweet> getUserFavs(long ownerID) {
final String[] ARGS = new String[]{Long.toString(ownerID), Integer.toString(limit)}; String[] args = {Long.toString(ownerID), Integer.toString(limit)};
final String QUERY = "SELECT * FROM tweet INNER JOIN favorit on tweet.tweetID=favorit.tweetID " +
"INNER JOIN user ON tweet.userID=user.userID WHERE favorit.ownerID=? ORDER BY tweetID DESC LIMIT ?";
SQLiteDatabase db = getDbRead(); SQLiteDatabase db = getDbRead();
List<Tweet> tweetList = new LinkedList<>(); List<Tweet> tweetList = new LinkedList<>();
Cursor cursor = db.rawQuery(USERFAVORIT_QUERY, args);
Cursor cursor = db.rawQuery(QUERY, ARGS);
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
do { do {
Tweet tweet = getStatus(cursor); Tweet tweet = getStatus(cursor);
@ -295,14 +295,11 @@ public class AppDatabase {
*/ */
@Nullable @Nullable
public Tweet getStatus(long tweetId) { public Tweet getStatus(long tweetId) {
final String[] ARGS = new String[]{Long.toString(tweetId)}; String[] args = {Long.toString(tweetId)};
final String QUERY = "SELECT * FROM tweet INNER JOIN user " +
"ON user.userID = tweet.userID WHERE tweet.tweetID=? LIMIT 1";
SQLiteDatabase db = getDbRead(); SQLiteDatabase db = getDbRead();
Tweet result = null; Tweet result = null;
Cursor cursor = db.rawQuery(SINGLE_TWEET_QUERY, args);
Cursor cursor = db.rawQuery(QUERY, ARGS);
if (cursor.moveToFirst()) if (cursor.moveToFirst())
result = getStatus(cursor); result = getStatus(cursor);
cursor.close(); cursor.close();
@ -316,15 +313,12 @@ public class AppDatabase {
* @return list of tweet answers * @return list of tweet answers
*/ */
public List<Tweet> getAnswers(long tweetId) { public List<Tweet> getAnswers(long tweetId) {
final String[] ARGS = new String[]{Long.toString(tweetId), Integer.toString(RPL_MASK), String[] args = {Long.toString(tweetId), Integer.toString(RPL_MASK),
Integer.toString(EXCL_USR), Integer.toString(limit)}; Integer.toString(EXCL_USR), Integer.toString(limit)};
final String QUERY = "SELECT * FROM tweet INNER JOIN user ON tweet.userID=user.userID " +
"WHERE tweet.replyID=? AND statusregister&? IS NOT 0 AND userregister&? IS 0 ORDER BY tweetID DESC LIMIT ?";
SQLiteDatabase db = getDbRead(); SQLiteDatabase db = getDbRead();
List<Tweet> tweetList = new LinkedList<>(); List<Tweet> tweetList = new LinkedList<>();
Cursor cursor = db.rawQuery(ANSWER_QUERY, args);
Cursor cursor = db.rawQuery(QUERY, ARGS);
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
do { do {
Tweet tweet = getStatus(cursor); Tweet tweet = getStatus(cursor);
@ -341,8 +335,8 @@ public class AppDatabase {
* @param tweet Tweet * @param tweet Tweet
*/ */
public void updateStatus(Tweet tweet) { public void updateStatus(Tweet tweet) {
final String[] tweetIdArg = {Long.toString(tweet.getId())}; String[] tweetIdArg = {Long.toString(tweet.getId())};
final String[] userIdArg = {Long.toString(tweet.getUser().getId())}; String[] userIdArg = {Long.toString(tweet.getUser().getId())};
SQLiteDatabase db = getDbWrite(); SQLiteDatabase db = getDbWrite();
ContentValues statColumn = new ContentValues(); ContentValues statColumn = new ContentValues();
@ -448,12 +442,11 @@ public class AppDatabase {
* @return list of trends * @return list of trends
*/ */
public List<TwitterTrend> getTrends(int woeId) { public List<TwitterTrend> getTrends(int woeId) {
final String[] ARGS = new String[]{Integer.toString(woeId)}; String[] args = {Integer.toString(woeId)};
final String QUERY = "SELECT * FROM trend WHERE woeID=? ORDER BY trendpos ASC";
List<TwitterTrend> trends = new LinkedList<>(); List<TwitterTrend> trends = new LinkedList<>();
SQLiteDatabase db = getDbRead(); SQLiteDatabase db = getDbRead();
Cursor cursor = db.rawQuery(QUERY, ARGS); Cursor cursor = db.rawQuery(TREND_QUERY, args);
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
do { do {
int index = cursor.getColumnIndex("trendname"); int index = cursor.getColumnIndex("trendname");
@ -475,12 +468,11 @@ public class AppDatabase {
* @return list of direct messages * @return list of direct messages
*/ */
public List<Message> getMessages() { public List<Message> getMessages() {
final String[] ARGS = new String[]{Integer.toString(limit)}; String[] args = {Integer.toString(limit)};
final String QUERY = "SELECT * FROM message ORDER BY messageID DESC LIMIT ?";
List<Message> result = new LinkedList<>(); List<Message> result = new LinkedList<>();
SQLiteDatabase db = getDbRead(); SQLiteDatabase db = getDbRead();
Cursor cursor = db.rawQuery(QUERY, ARGS); Cursor cursor = db.rawQuery(MESSAGE_QUERY, args);
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
do { do {
int index = cursor.getColumnIndex("senderID"); int index = cursor.getColumnIndex("senderID");
@ -564,13 +556,14 @@ public class AppDatabase {
boolean retweeted = (statusregister & RTW_MASK) != 0; boolean retweeted = (statusregister & RTW_MASK) != 0;
boolean sensitive = (statusregister & MEDIA_SENS_MASK) != 0; boolean sensitive = (statusregister & MEDIA_SENS_MASK) != 0;
String[] medias = parseMedia(medialinks); String[] medias = parseMedia(medialinks);
// get media type
Tweet.MediaType mediaType = Tweet.MediaType.NONE; Tweet.MediaType mediaType = Tweet.MediaType.NONE;
if ((statusregister & MEDIA_IMAGE_MASK) == MEDIA_IMAGE_MASK) if ((statusregister & MEDIA_ANGIF_MASK) == MEDIA_ANGIF_MASK)
mediaType = Tweet.MediaType.GIF;
else if ((statusregister & MEDIA_IMAGE_MASK) == MEDIA_IMAGE_MASK)
mediaType = Tweet.MediaType.IMAGE; mediaType = Tweet.MediaType.IMAGE;
else if ((statusregister & MEDIA_VIDEO_MASK) == MEDIA_VIDEO_MASK) else if ((statusregister & MEDIA_VIDEO_MASK) == MEDIA_VIDEO_MASK)
mediaType = Tweet.MediaType.VIDEO; mediaType = Tweet.MediaType.VIDEO;
else if ((statusregister & MEDIA_ANGIF_MASK) == MEDIA_ANGIF_MASK)
mediaType = Tweet.MediaType.GIF;
TwitterUser user = getUser(cursor); TwitterUser user = getUser(cursor);
Tweet embeddedTweet = null; Tweet embeddedTweet = null;
if (retweetId > 1) if (retweetId > 1)
@ -588,11 +581,10 @@ public class AppDatabase {
*/ */
@Nullable @Nullable
private TwitterUser getUser(long userId, SQLiteDatabase db) { private TwitterUser getUser(long userId, SQLiteDatabase db) {
final String[] ARGS = new String[]{Long.toString(userId)}; String[] args = {Long.toString(userId)};
final String QUERY = "SELECT * FROM user WHERE userID=? LIMIT 1";
TwitterUser user = null; TwitterUser user = null;
Cursor cursor = db.rawQuery(QUERY, ARGS); Cursor cursor = db.rawQuery(USER_QUERY, args);
if (cursor.moveToFirst()) if (cursor.moveToFirst())
user = getUser(cursor); user = getUser(cursor);
cursor.close(); cursor.close();
@ -795,10 +787,9 @@ public class AppDatabase {
* @return tweet flags * @return tweet flags
*/ */
private int getTweetFlags(SQLiteDatabase db, long tweetID) { private int getTweetFlags(SQLiteDatabase db, long tweetID) {
final String[] ARGS = new String[]{Long.toString(tweetID)}; String[] args = {Long.toString(tweetID)};
final String QUERY = "SELECT statusregister FROM tweet WHERE tweetID=? LIMIT 1;";
Cursor c = db.rawQuery(QUERY, ARGS); Cursor c = db.rawQuery(TWEETFLAG_QUERY, args);
int result = 0; int result = 0;
if (c.moveToFirst()) { if (c.moveToFirst()) {
int pos = c.getColumnIndex("statusregister"); int pos = c.getColumnIndex("statusregister");
@ -816,10 +807,9 @@ public class AppDatabase {
* @return user flags * @return user flags
*/ */
private int getUserFlags(SQLiteDatabase db, long userID) { private int getUserFlags(SQLiteDatabase db, long userID) {
final String[] ARGS = new String[]{Long.toString(userID)}; String[] args = {Long.toString(userID)};
final String QUERY = "SELECT userregister FROM user WHERE userID=? LIMIT 1;";
Cursor c = db.rawQuery(QUERY, ARGS); Cursor c = db.rawQuery(USERFLAG_QUERY, args);
int result = 0; int result = 0;
if (c.moveToFirst()) { if (c.moveToFirst()) {
int pos = c.getColumnIndex("userregister"); int pos = c.getColumnIndex("userregister");
@ -829,7 +819,6 @@ public class AppDatabase {
return result; return result;
} }
/** /**
* check if tweet exists in database * check if tweet exists in database
* *
@ -838,10 +827,9 @@ public class AppDatabase {
* @return true if found * @return true if found
*/ */
private boolean containStatus(long id, SQLiteDatabase db) { private boolean containStatus(long id, SQLiteDatabase db) {
final String[] ARGS = new String[]{Long.toString(id)}; String[] args = {Long.toString(id)};
final String QUERY = "SELECT tweetID FROM tweet WHERE tweetID=? LIMIT 1;";
Cursor c = db.rawQuery(QUERY, ARGS); Cursor c = db.rawQuery(STATUS_EXIST_QUERY, args);
boolean result = c.moveToFirst(); boolean result = c.moveToFirst();
c.close(); c.close();
return result; return result;

View File

@ -76,6 +76,71 @@ public class DatabaseAdapter {
private static final String TABLE_TWEET_ADD_GEO = "ALTER TABLE tweet ADD COLUMN geo TEXT"; private static final String TABLE_TWEET_ADD_GEO = "ALTER TABLE tweet ADD COLUMN geo TEXT";
private static final String TABLE_TREND_ADD_VOL = "ALTER TABLE trend ADD COLUMN vol INTEGER"; private static final String TABLE_TREND_ADD_VOL = "ALTER TABLE trend ADD COLUMN vol INTEGER";
/**
* SQL query to get home timeline tweets
*/
static final String HOMETL_QUERY = "SELECT * FROM tweet INNER JOIN user ON tweet.userID=user.userID " +
"WHERE statusregister&? IS NOT 0 ORDER BY tweetID DESC LIMIT ?";
/**
* SQL query to get mention timeline
*/
static final String MENTION_QUERY = "SELECT * FROM tweet INNER JOIN user ON tweet.userID=user.userID " +
"WHERE statusregister&? IS NOT 0 AND userregister&? IS 0 ORDER BY tweetID DESC LIMIT ?";
/**
* SQL query to get tweets of an user
*/
static final String USERTWEET_QUERY = "SELECT * FROM tweet INNER JOIN user ON tweet.userID=user.userID " +
"WHERE statusregister&? IS NOT 0 AND user.userID=? ORDER BY tweetID DESC LIMIT ?";
/**
* SQL query to get tweets favorited by an user
*/
static final String USERFAVORIT_QUERY = "SELECT * FROM tweet INNER JOIN favorit on tweet.tweetID=favorit.tweetID " +
"INNER JOIN user ON tweet.userID=user.userID WHERE favorit.ownerID=? ORDER BY tweetID DESC LIMIT ?";
/**
* SQL query to get a single tweet specified by an ID
*/
static final String SINGLE_TWEET_QUERY = "SELECT * FROM tweet INNER JOIN user ON user.userID = tweet.userID WHERE tweet.tweetID=? LIMIT 1";
/**
* SQL query to get replies of a tweet specified by a reply ID
*/
static final String ANSWER_QUERY = "SELECT * FROM tweet INNER JOIN user ON tweet.userID=user.userID " +
"WHERE tweet.replyID=? AND statusregister&? IS NOT 0 AND userregister&? IS 0 ORDER BY tweetID DESC LIMIT ?";
/**
* SQL query to get locale based trends
*/
static final String TREND_QUERY = "SELECT * FROM trend WHERE woeID=? ORDER BY trendpos ASC";
/**
* SQL query to get direct messages
*/
static final String MESSAGE_QUERY = "SELECT * FROM message ORDER BY messageID DESC LIMIT ?";
/**
* SQL query to get user information
*/
static final String USER_QUERY = "SELECT * FROM user WHERE userID=? LIMIT 1";
/**
* SQL query to get a status register for a tweet
*/
static final String TWEETFLAG_QUERY = "SELECT statusregister FROM tweet WHERE tweetID=? LIMIT 1;";
/**
* SQL query to get a status register of an user
*/
static final String USERFLAG_QUERY = "SELECT userregister FROM user WHERE userID=? LIMIT 1;";
/**
* SQL query to check if a status exists in database
*/
static final String STATUS_EXIST_QUERY = "SELECT tweetID FROM tweet WHERE tweetID=? LIMIT 1;";
private static DatabaseAdapter instance; private static DatabaseAdapter instance;
private final File databasePath; private final File databasePath;