/ / android.database.sqlite.SQLiteException: la table contact_data n'a pas de colonne nommée timestamp_ - java, android, sqlite, jdbc

android.database.sqlite.SQLiteException: la table contact_data n'a pas de colonne nommée timestamp_ - java, android, sqlite, jdbc

Eh bien, ce que j'essaie de faire, c'est de mettre à jour mon application lors de la première installation. Ainsi, lors du premier accès, mon application dispose d'un service qui accède au CallLog, récupère toutes les données et les insère dans la base de données d'application.

Et j'ai une colonne timestamp_ que je veux insérer l'horodatage de l'appel. Mais quand j'essaye de l'insérer, il dit que la table n'a pas de colonne nommée timestamp_, et c'est explicitement écrit dans la chaîne sql ce nom de la colonne. Je ne sais pas pourquoi ça fait ça.

Ma chaîne CREATE TABLE est écrite dans le strings.xml, et j'accède à cette chaîne et la divise en obtenant chaque ligne.

Voici le code du Service, la chaîne SQL et après le code du DataHandlerDB, qui a la méthode qui crée la base de données.

Mon service:

package com.myapp.test;

import java.text.SimpleDateFormat;
import java.util.Date;

import com.rogercg.phonestatistics.CallDataHelper.OpenHelper;

import android.app.Service;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.provider.Contacts;
import android.text.format.DateFormat;
import android.util.Log;
import android.widget.Toast;

public class RatedCallsService extends Service {

private static final String LOG_TAG = "RatedCallsService";
private Handler handler = new Handler();
private SQLiteDatabase db;
private OpenHelper helper;
private String theDate;
private String theMonth_;
private String theYear_;
private String theDay_;
public static boolean servReg = false;

class RatedCallsContentObserver extends ContentObserver {

public RatedCallsContentObserver(Handler h) {

super(h);
helper = new OpenHelper(getApplicationContext());
db = helper.getWritableDatabase();
Log.i(LOG_TAG, "constructor");

}

@Override
public boolean deliverSelfNotifications() {
Log.i(LOG_TAG, "deliver self");
return true;

}

@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.i(LOG_TAG, "selfchange " + selfChange);
searchInsert();

}
}

@Override
public void onCreate() {

servReg = true;
helper = new OpenHelper(getApplicationContext());
db = DataHandlerDB.createDB(this);

registerContentObserver();

Cursor dbsize = DataHandlerDB.selectTopCalls(this
.getApplicationContext());
if (dbsize.getCount() == 0) {

Toast.makeText(this.getApplicationContext(), "Updating Database.",
Toast.LENGTH_LONG).show();
Log.i(LOG_TAG, "Atualizou " + dbsize.getCount());
updateDB();

}
Cursor currsize = DataHandlerDB.selectTopCalls(this
.getApplicationContext());
currsize.moveToFirst();
Log.i(LOG_TAG, "cursize " + currsize.getCount());
}

@Override
public void onDestroy() {

super.onDestroy();
db.close();
this.getApplicationContext()
.getContentResolver()
.unregisterContentObserver(
new RatedCallsContentObserver(handler));
servReg = false;
}

@Override
public IBinder onBind(Intent arg0) {

return null;

}

protected void searchInsert() {

Cursor cursor = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
android.provider.CallLog.Calls.DATE + " DESC ");

if (cursor.moveToFirst()) {

int numberColumnId = cursor
.getColumnIndex(android.provider.CallLog.Calls.NUMBER);
int durationId = cursor
.getColumnIndex(android.provider.CallLog.Calls.DURATION);
int contactNameId = cursor
.getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
int numTypeId = cursor
.getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE);
int callTypeId = cursor
.getColumnIndex(android.provider.CallLog.Calls.TYPE);
int dateColumnId = cursor
.getColumnIndex(android.provider.CallLog.Calls.DATE);

Date dt = new Date();
int hours = dt.getHours();
int minutes = dt.getMinutes();
int seconds = dt.getSeconds();
String currTime = hours + ":" + minutes + ":" + seconds;

SimpleDateFormat dateFormat = new SimpleDateFormat("M/d/yyyy");

Date date = new Date();

cursor.moveToFirst();

String contactNumber = cursor.getString(numberColumnId);
String contactName = (null == cursor.getString(contactNameId) ? ""
: cursor.getString(contactNameId));
String duration = cursor.getString(durationId);
String numType = cursor.getString(numTypeId);
String callType = cursor.getString(callTypeId);
String dateColumn = cursor.getString(dateColumnId);

seconds = Integer.parseInt(duration);

theDate = dateFormat.format(date);

if (theDate.length() == 9) {

theMonth_ = theDate.substring(0, 1);
theDay_ = theDate.substring(2, 4);
theYear_ = theDate.substring(5, 9);

} else if (theDate.length() == 10) {

theMonth_ = theDate.substring(0, 2);
theDay_ = theDate.substring(3, 4);
theYear_ = theDate.substring(6, 10);

} else if (theDate.length() == 8) {

theMonth_ = theDate.substring(0, 1);
theDay_ = theDate.substring(2, 3);
theYear_ = theDate.substring(4, 8);

}

ContentValues values = new ContentValues();
ContentValues values2 = new ContentValues();

values.put("contact_id", 1);
values.put("contact_name", contactName);
values.put("number_type", numType);
values.put("contact_number", contactNumber);
values.put("duration", Utilities.convertTime(seconds));
values.put("date", dateFormat.format(date));
values.put("timestamp_", dateColumn);
values.put("current_time", currTime);
values.put("cont", 1);
values.put("type", callType);

values2.put("month",
Utilities.monthName(Integer.parseInt(theMonth_)));
values2.put("duration", Utilities.convertTime(seconds));
values2.put("year", theYear_);
values2.put("month_num", Integer.parseInt(theMonth_));

if (!db.isOpen()) {
db = getApplicationContext()
.openOrCreateDatabase(
"/data/data/com.myapp.test/databases/calls.db",
SQLiteDatabase.OPEN_READWRITE, null);
}
if (duration != "") {
if (Integer.parseInt(duration) != 0) {

String existingMonthDuration = DataHandlerDB
.selectMonthsDuration(theMonth_, theYear_, this);
Integer newMonthDuration;

// Verifica se ja existe mes no MONTHS_DUR
if (existingMonthDuration != "") {

newMonthDuration = Integer
.parseInt(existingMonthDuration)
+ Integer.parseInt(duration);

values2.put("duration",
Utilities.convertTime(newMonthDuration));

db.update(DataHandlerDB.MONTHS_DUR, values2,
"year = ?", new String[] { theYear_ });

} else {

db.insert(DataHandlerDB.MONTHS_DUR, null, values2);

}

Cursor c = DataHandlerDB.selectTimeStamp(this
.getApplicationContext());
if (c.moveToFirst()) {
Log.i(LOG_TAG, "c.getstr8: " + c.getString(8));
if (!c.getString(8).equals(dateColumn)) {
Log.i(LOG_TAG, "Antes do db.insert line 202");
db.insert(DataHandlerDB.CONTACT_DATA, null, values);
}
}
}
}
cursor.close();
}
}

protected void updateDB() {

Cursor cursor = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI, null, null, null,
null);

cursor.moveToFirst();

do {

int numberColumnId = cursor
.getColumnIndex(android.provider.CallLog.Calls.NUMBER);
int durationId = cursor
.getColumnIndex(android.provider.CallLog.Calls.DURATION);
int contactNameId = cursor
.getColumnIndex(android.provider.CallLog.Calls.CACHED_NAME);
int numTypeId = cursor
.getColumnIndex(android.provider.CallLog.Calls.CACHED_NUMBER_TYPE);
int callTypeId = cursor
.getColumnIndex(android.provider.CallLog.Calls.TYPE);
int dateColumnId = cursor
.getColumnIndex(android.provider.CallLog.Calls.DATE);

Date dt = new Date();
int hours = dt.getHours();
int minutes = dt.getMinutes();
int seconds = dt.getSeconds();
String currTime = hours + ":" + minutes + ":" + seconds;

SimpleDateFormat dateFormat = new SimpleDateFormat("M/d/yyyy");

Date date = new Date();

String contactNumber = cursor.getString(numberColumnId);
String contactName = (null == cursor.getString(contactNameId) ? ""
: cursor.getString(contactNameId));
String duration = cursor.getString(durationId);
String numType = cursor.getString(numTypeId);
String callType = cursor.getString(callTypeId);
String dateColumn = cursor.getString(dateColumnId);

seconds = Integer.parseInt(duration);

theDate = dateFormat.format(date);

if (theDate.length() == 9) {

theMonth_ = theDate.substring(0, 1);
theDay_ = theDate.substring(2, 4);
theYear_ = theDate.substring(5, 9);

} else if (theDate.length() == 10) {

theMonth_ = theDate.substring(0, 2);
theDay_ = theDate.substring(3, 4);
theYear_ = theDate.substring(6, 10);

} else if (theDate.length() == 8) {

theMonth_ = theDate.substring(0, 1);
theDay_ = theDate.substring(2, 3);
theYear_ = theDate.substring(4, 8);

}

ContentValues values = new ContentValues();
ContentValues values2 = new ContentValues();

values.put("contact_id", 1);
values.put("contact_name", contactName);
values.put("number_type", numType);
values.put("contact_number", contactNumber);
values.put("duration", Utilities.convertTime(seconds));
values.put("date", dateFormat.format(date));
values.put("timestamp_", dateColumn);
values.put("current_time", currTime);
values.put("cont", 1);
values.put("type", callType);

values2.put("month",
Utilities.monthName(Integer.parseInt(theMonth_)));
values2.put("duration", Utilities.convertTime(seconds));
values2.put("year", theYear_);
values2.put("month_num", Integer.parseInt(theMonth_));

if (!db.isOpen()) {
db = getApplicationContext()
.openOrCreateDatabase(
"/data/data/com.myapp.test/databases/calls.db",
SQLiteDatabase.OPEN_READWRITE, null);
}
if (duration != "") {
if (Integer.parseInt(duration) != 0) {

String existingMonthDuration = DataHandlerDB
.selectMonthsDuration(theMonth_, theYear_, this);
Integer newMonthDuration;

// Verifica se ja existe mes no MONTHS_DUR
if (existingMonthDuration != "") {

newMonthDuration = Integer
.parseInt(existingMonthDuration)
+ Integer.parseInt(duration);

values2.put("duration",
Utilities.convertTime(newMonthDuration));

db.update(DataHandlerDB.MONTHS_DUR, values2,
"year = ?", new String[] { theYear_ });

} else {

db.insert(DataHandlerDB.MONTHS_DUR, null, values2);

}
db.insert(DataHandlerDB.CONTACT_DATA, null, values);
}
}

} while (cursor.moveToNext());
cursor.close();
}

public void registerContentObserver() {

Log.i(LOG_TAG, "Registrou ContentObserver");
this.getApplicationContext()
.getContentResolver()
.registerContentObserver(
android.provider.CallLog.Calls.CONTENT_URI, true,
new RatedCallsContentObserver(handler));
}
}

My DataHandlerDB. (Traite de la base de données):

public class DataHandlerDB {

private static final String DATABASE_NAME = "calls.db";
private static final int DATABASE_VERSION = 1;
protected static final String RATED_CONTACTS = "rated_contacts";
protected static final String CONTACT_DATA = "contact_data";
protected static final String MONTHS_DUR = "months_dur";
private static final String LOG_TAG = "DataHandlerDB";

protected static String CONTACT__ID_COL = "_id";
protected static String CONTACT_NAME_COL = "contact_name";
protected static String CONTACT_NUMBER_COL = "contact_number";
protected static String CONTACT_DURATION_COL = "duration";
protected static String CONTACT_DATE_COL = "date";
protected static String CONTACT_MONTH_COL = "month";

// create the DB
public static SQLiteDatabase createDB(Context ctx) {
OpenHelper helper = new OpenHelper(ctx);
SQLiteDatabase db = helper.getWritableDatabase();
helper.onCreate(db);
helper.onOpen(db);
db.close();
return db;
}

public static class OpenHelper extends SQLiteOpenHelper {

private final Context mContext;

OpenHelper(Context context) {

super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.mContext = context;

}

@Override
public void onCreate(SQLiteDatabase db) {

String[] sql = mContext.getString(
R.string.My_OnCreate).split("n");
db.beginTransaction();

try {
Log.i(LOG_TAG, "entrou no try");
execMultipleSQL(db, sql);
db.setTransactionSuccessful();

} catch (SQLException e) {

Log.e("Error creating tables and debug data ", e.toString());
throw e;

} finally {

db.endTransaction();

}
}

private void execMultipleSQL(SQLiteDatabase db, String[] sql) {

for (String s : sql) {

if (s.trim().length() > 0) {

db.execSQL(s);
Log.i(LOG_TAG, "Str sql " + s);
}
}

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
/*
* Log.w("RatedContacts Database",
* "Upgrading database, this will drop tables and recreate.");
* db.execSQL("DROP TABLE IF EXISTS " + RATED_CONTACTS); onCreate(db);
*/
}

@Override
public void onOpen(SQLiteDatabase db) {

super.onOpen(db);
}

}

}

La chaîne SQL (déclarée dans strings.xml):

<string name="My_OnCreate">
"CREATE TABLE IF NOT EXISTS contact_data ( _id INTEGER PRIMARY KEY AUTOINCREMENT, contact_id INTEGER, contact_name VARCHAR(50), number_type VARCHAR(50), contact_number VARCHAR(50), duration TIME, duration_sum TIME, date DATE, timestamp_ VARCHAR(50), current_time TIME, cont INTEGER, type VARCHAR(50), month VARCHAR(50), day VARCHAR(50), year VARCHAR(50) );
CREATE TABLE IF NOT EXISTS rated_contacts ( _id INTEGER PRIMARY KEY AUTOINCREMENT, contact_id INTEGER, contact_name VARCHAR(50), number_type VARCHAR(50), contact_number VARCHAR(50), duration TIME, duration_sum TIME, date DATE, timestamp_ VARCHAR(50), current_time TIME, cont INTEGER, type VARCHAR(50), month VARCHAR(50), day VARCHAR(50), year VARCHAR(50) );
CREATE TABLE IF NOT EXISTS months_dur ( _id INTEGER PRIMARY KEY AUTOINCREMENT, month VARCHAR(50), duration TIME, year VARCHAR(250), month_num INTEGER );"
</string>

Voici l'erreur du LogCat:

06-13 18: 58: 05.041: INFO / Base de données (2121): sqlite a renvoyé: code d'erreur = 1, msg = table contact_data n'a pas de colonne nommée timestamp_

06-13 18:58:05.081: ERREUR / Base de données (2121): erreur d'insertion contact_number = 1234545 durée = 00: 00: 05 contact_id = 1 timestamp_ = 1307928304514 number_type = 0 contact_name = current_time = 18: 58: 4 type = 2 cont = 1 date = 6/13/2011 06-13 18: 58: 05.081:

ERREUR / Base de données (2121): android.database.sqlite.SQLiteException: la table contact_data n'a pas de colonne nommée timestamp_:, lors de la compilation: INSERT INTO contact_data (contact_number, durée, contact_id, timestamp_, numéro_type, nom_contact, heure_courante, type, cont, date) VALEURS(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);

Réponses:

1 pour la réponse № 1

Je pense que c'est une erreur dans le code de liaison entre Java et SQLite. Pouvez-vous essayer de renommer "timestamp_" en "time_stamp", pour un test?