问题描述
|
好吧,我想做的是在第一次安装时对我的应用程序进行设置。因此,在第一次访问中,我的应用程序具有访问CallLog,检索所有数据并将其插入应用程序数据库的服务。
我有一个列“ 0”,我想插入呼叫的时间戳。但是,当我尝试插入时,它说该表没有名为timestamp_的列,并且该列的名称明确地写在sql字符串中。我不知道为什么要这么做。
我的CREATE TABLE字符串写在ѭ1中,我访问该字符串并将其拆分成每一行。
这是服务的代码,sql字符串,然后是DataHandlerDB的代码,后面是创建数据库的方法。
我的服务:
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,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,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,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,values);
}
}
}
}
cursor.close();
}
}
protected void updateDB() {
Cursor cursor = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI,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,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\",null);
}
if (duration != \"\") {
if (Integer.parseInt(duration) != 0) {
String existingMonthDuration = DataHandlerDB
.selectMonthsDuration(theMonth_,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,new String[] { theyear_ });
} else {
db.insert(DataHandlerDB.MONTHS_DUR,values2);
}
db.insert(DataHandlerDB.CONTACT_DATA,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));
}
}
我的DataHandlerDB。(与数据库一起处理):
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,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);
}
}
}
sql字符串(在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,year VARCHAR(50) );
CREATE TABLE IF NOT EXISTS months_dur ( _id INTEGER PRIMARY KEY AUTOINCREMENT,year VARCHAR(250),month_num INTEGER );\"
</string>
这是LogCat的错误:
06-13 18:58:05.041:
INFO /数据库(2121):sqlite返回:
错误代码= 1,味精=表
contact_data没有名为的列
时间戳_
06-13 18:58:05.081:
错误/数据库(2121):插入错误
contact_number = 1234545
持续时间= 00:00:05 contact_id = 1
timestamp_ = 1307928304514 number_type = 0
contact_name =当前时间= 18:58:4
type = 2 cont = 1 date = 6/13/2011 06-13
18:58:05.081:
错误/数据库(2121):
android.database.sqlite.sqliteException:
表contact_data没有名为的列
timestamp_:,而在编译时:INSERT
INTO contact_data(contact_number,
持续时间,contact_id,timestamp_,
number_type,contact_name,
current_time,类型,续,日期)
值(?,?,?,?,?,?,?,?,?,?);
解决方法
我认为这是Java和SQLite之间的绑定代码中的错误。您可以尝试将\“ timestamp_ \”重命名为\“ time_stamp \”进行测试吗?