Im trying to update the “html” column in every row in my database when the app is synchronizing. I’ve used this tutorial Here to add the app to the “profile” list. This is the code I use in the SyncAdapter:
private static void performSync(Context context, Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) throws OperationCanceledException {
MySQLiteHelper openHelperClass;
SQLiteDatabase sqliteDatabase;
String str;
mContentResolver = context.getContentResolver();
Log.i(TAG, "performSync: " + account.toString());
Log.v(TAG, "CDS Opened!");
openHelperClass = new MySQLiteHelper(context);
sqliteDatabase = openHelperClass.getWritableDatabase();
Log.v(TAG, "CDS loaded db!");
Cursor cursor = sqliteDatabase.query("offline", null, null, null, null, null, null);
Log.v(TAG, "CDS queried!");
if(cursor != null) {
Log.v(TAG, "Cursor not null!");
Log.v(TAG,cursor.toString());
if(cursor.moveToFirst()) {
Log.v(TAG, "first pos");
while(cursor.moveToNext()) {
Log.v(TAG, "1");
Log.v(TAG, "Cursor moving!");
String skolelogg = cursor.getString(cursor.getColumnIndexOrThrow(MySQLiteHelper.COLUMN_SKOLE_LOGGING_OFFLINE));
int skplid = cursor.getInt(cursor.getColumnIndexOrThrow(MySQLiteHelper.COLUMN_PLAN_ID));
String skplant = cursor.getString(cursor.getColumnIndexOrThrow(MySQLiteHelper.COLUMN_PLAN_TYPE));
int offid = cursor.getInt(cursor.getColumnIndexOrThrow(MySQLiteHelper.COLUMN_ID_OFFLINE));
try {
HttpClient hc = new DefaultHttpClient();
HttpPost post = new HttpPost("https://romres.ist-asp.com/WebUntis/Timetable.do?simple=1&type=" + skplant + "&" + skolelogg + "&id="+ Integer.toString(skplid));
HttpResponse rp = hc.execute(post);
if(rp.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
str = EntityUtils.toString(rp.getEntity());
Log.v(TAG, "Syncing....");
Log.v(TAG, "Syncing ID: " + Integer.toString(offid));
String csstext = "<link rel='stylesheet' type='text/css' href='Styles/webuntis.css'>";
csstext += "<style type='text/css'>";
csstext += "*.A_0_1 {background:#f49f25;font-size:12px;}";
csstext += "*.I_100_28 {background:#ffff80;}";
csstext += "*.I_100_29 {background:#ffff80;}";
csstext += "*.I_100_30 {background:#ffff80;}";
csstext += "*.I_100_31 {background:#ffff80;}";
csstext += "*.I_100_368 {background:#ffff80;}";
csstext += "*.I_100_710 {background:#ff00ff;}";
csstext += "*.A_0_9 td,*.A_0_11 td,*.A_0_12 td,*.A_11_9 td,*.A_11_11 td,*.A_11_12 td,*.A_40_9 td,*.A_40_11 td,*.A_40_12 td,*.A_41_9 td,*.A_41_11 td,*.A_41_12 td,*.A_5_9 td,*.A_5_11 td,*.A_5_12 td,*.A_10_9 td,*.A_10_11 td,*.A_10_12 td,*.A_50_9 td,*.A_50_11 td,*.A_50_12 td,*.A_51_9 td,*.A_51_11 td,*.A_51_12 td,*.A_15_9 td,*.A_15_11 td,*.A_15_12 td,*.A_20_9 td,*.A_20_11 td,*.A_20_12 td {text-decoration: line-through;}";
csstext += "</style>";
Document doc = Jsoup.parse(str);
Element title = doc.select("div.def").first();
String s = title.toString();
Element offlinetext = doc.append("<div class='offlinetext'>Offline-Timeplan</div>");
String offltt = "<div class='offlinetext'>Offline-Timeplan</div>";
String extraCSS = "<style>";
extraCSS += ".offlinetext {font-family: Arial; font-size: 20px; font-style: normal; font-weight: 500; color: #FF9900; line-height: 19px; height: 30px;}';";
extraCSS += "</style>";
Element title2 = doc.select("div.pagetitle").first();
String s2 = title2.toString();
str = csstext + extraCSS + offltt + s2 + s;
ContentValues cv = new ContentValues();
cv.put(MySQLiteHelper.COLUMN_SKOLE_HTML_CODE, str);
sqliteDatabase.update(MySQLiteHelper.TABLE_OFFLINE, cv, "_id = ?", new String [] { Integer.toString(offid) });
}
}
catch(IOException e){
Log.v(TAG, e.toString());
}
}
}
else {
Log.v(TAG, "moveToNext() is false");
}
}
else{
Log.v(TAG, "It's null");
}
}
Here’s the LogCat output when I press “synchronize” in the settings menu in Android:
12-04 21:17:30.066: D/webviewglue(20944): nativeDestroy view: 0x51028af0
12-04 21:17:39.241: I/ContactsSyncAdapterService(21115): performSync: Account {name=*, type=*.account}
12-04 21:17:39.246: V/ContactsSyncAdapterService(21115): CDS Opened!
12-04 21:17:39.251: V/ContactsSyncAdapterService(21115): CDS loaded db!
12-04 21:17:39.251: V/ContactsSyncAdapterService(21115): CDS queried!
12-04 21:17:39.251: V/ContactsSyncAdapterService(21115): Cursor not null!
12-04 21:17:39.256: V/ContactsSyncAdapterService(21115): android.database.sqlite.SQLiteCursor@411c4de0
12-04 21:17:39.256: V/ContactsSyncAdapterService(21115): moveToNext() is false
The problem is that everything works fine until it gets to cursor.moveToFirst(). As you can see, the cursor is both null and not null(?) at the same time, since it gets past the “cursor != null” check but returns “cursor.moveToFirst” with null. I really need help. I can’t figure out what’s wrong. I’m still a noob at writing a SyncAdapter and even a ContentProvider.
EDIT: I’m stupid. As Justin pointed out, the cursor was indeed empty because there were no rows in the table. It worked after I added an entry into the table!
moveToFirst()returning false means that your cursor is empty (has no rows). That is not equivalent to null.