2

what kind of query do i need to use for

"create table CallDB as (select * from CallLog.Calls) "

I want to store the entire calllog for my processing into another table . Because I read taht calllog.calls only has last 500 records

Srinath Ganesh
  • 2,496
  • 2
  • 30
  • 60
  • Your SQL statement looks fine, what is your question? – Sam Mar 02 '13 at 19:16
  • how do I do the query as in my Question in the program . Calllog.calls is a content provider and I am new to android . (I have managed to retrive call in,out,missed details from system tables) – Srinath Ganesh Mar 02 '13 at 19:20

1 Answers1

2

ok I made a solution of my own . Dont know if its the best but still

Any one has a more easy/memory efficient solution ???


package database;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.provider.CallLog;
import android.util.Log;
import android.widget.Toast;

public class CallDBDatasource 
{

Context context;

private SQLiteDatabase db;
private CallDBHelper dbHelper;

public CallDBDatasource(Context context) {
    // TODO Auto-generated constructor stub
    this.context = context;
    dbHelper = new CallDBHelper(context);
}

public void open() throws SQLException {
    db = dbHelper.getWritableDatabase();

    Log.d("CallDBDatasource", "insert check");

    Toast t = Toast.makeText(context, "try... "  , Toast.LENGTH_SHORT);
    t.show();

    Cursor callInitCheck = db.rawQuery("select count(*) from call", null);

    Toast t2a = Toast.makeText(context, "count rows " + callInitCheck.getCount() , Toast.LENGTH_SHORT);
    t2a.show();

    callInitCheck.moveToNext();
    if( Integer.parseInt( callInitCheck.getString(0)) == 0) // if no rows then do
    {
        // if empty then insert into call

        // select * from CallLog.Calls
        String[] allCol = {
                CallLog.Calls.CACHED_NAME , 
                CallLog.Calls.CACHED_NUMBER_LABEL ,
                CallLog.Calls.CACHED_NUMBER_TYPE ,
                CallLog.Calls.DATE , 
                CallLog.Calls.DURATION , 
                CallLog.Calls.TYPE , 
                CallLog.Calls.NUMBER
                };

                Cursor c = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, allCol , null,null, null);

                if(c.moveToFirst())
                {
                    Toast t3 = Toast.makeText(context, "count " + c.getColumnCount() , Toast.LENGTH_LONG);
                    t3.show();

                    Log.d("CallDBDatasource", "inside cursor");

                    CallDB callDB = new CallDB();

                    int indexCACHED_NAME = c.getColumnIndex(CallLog.Calls.CACHED_NAME);
                    int indexCACHED_NUMBER_LABEL = c.getColumnIndex(CallLog.Calls.CACHED_NUMBER_LABEL);
                    int indexCACHED_NUMBER_TYPE = c.getColumnIndex(CallLog.Calls.CACHED_NUMBER_TYPE);
                    int indexDATE = c.getColumnIndex(CallLog.Calls.DATE);
                    int indexDURATION = c.getColumnIndex(CallLog.Calls.DURATION);
                    int indexNUMBER = c.getColumnIndex(CallLog.Calls.TYPE);
                    int indexTYPE = c.getColumnIndex(CallLog.Calls.NUMBER);

                    do
                    {
                        callDB.setCACHED_NAME(c.getString(indexCACHED_NAME));
                        callDB.setCACHED_NUMBER_LABEL(c.getString(indexCACHED_NUMBER_LABEL));
                        callDB.setCACHED_NUMBER_TYPE(c.getString(indexCACHED_NUMBER_TYPE));
                        callDB.setDATE(c.getString(indexDATE));
                        callDB.setDURATION(c.getString(indexDURATION));
                        callDB.setTYPE(c.getString(indexNUMBER));
                        callDB.setNUMBER(c.getString(indexTYPE));

                        insert(callDB);
                    }
                    while(c.moveToNext());
                    Toast t1 = Toast.makeText(context, "added " + c.getCount() , Toast.LENGTH_SHORT);
                    t1.show();
                    //close cursor
                    c.close();

                } // end if cursor

                Log.d("CallDBDatasource", "INITED :)");
    } // end if
    callInitCheck.close();

  } // end open()

public void close() {
    dbHelper.close();
    Log.d("CallDBDatasource", "close()");
} // end close()

public void insert(CallDB callDB) {

    ContentValues values = new ContentValues();

    values.put(CallDBHelper.CACHED_NAME, callDB.getCACHED_NAME());
    values.put(CallDBHelper.CACHED_NUMBER_LABEL, callDB.getCACHED_NUMBER_LABEL());
    values.put(CallDBHelper.CACHED_NUMBER_TYPE, callDB.getCACHED_NUMBER_TYPE());
    values.put(CallDBHelper.DATE, callDB.getDATE());
    values.put(CallDBHelper.DURATION, callDB.getDURATION());
    values.put(CallDBHelper.NUMBER, callDB.getNUMBER());
    values.put(CallDBHelper.TYPE, callDB.getTYPE());

    db.insert(CallDBHelper.DATABASE_TABLE, "" , values);
    Log.d("CallDBDatasource", "values inserted");

} // end insert

public void update(CallDB callDB) {

    ContentValues values = new ContentValues();

    values.put(CallDBHelper.CACHED_NAME, callDB.getCACHED_NAME());
    values.put(CallDBHelper.CACHED_NUMBER_LABEL, callDB.getCACHED_NUMBER_LABEL());
    values.put(CallDBHelper.CACHED_NUMBER_TYPE, callDB.getCACHED_NUMBER_TYPE());
    values.put(CallDBHelper.DATE, callDB.getDATE());
    values.put(CallDBHelper.DURATION, callDB.getDURATION());
    values.put(CallDBHelper.NUMBER, callDB.getNUMBER());
    values.put(CallDBHelper.TYPE, callDB.getTYPE());

    db.update(CallDBHelper.DATABASE_TABLE, values , null, null);

    Log.d("CallDBDatasource", "values updated");

} // end update

public long cIn() {
    long ret = 0L;

        Cursor c = db.rawQuery("select sum(DURATION) from call where TYPE = ?", new String[] { String.valueOf(CallLog.Calls.INCOMING_TYPE) });

        if(c.moveToNext())
        {
            try {
                Toast t = Toast.makeText(context, "" + c.getString(0) , Toast.LENGTH_SHORT);
                t.show();
                ret = Long.parseLong(c.getString(0));
            } catch (NumberFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        c.close();

    return ret;
} // end cIn()

public long cOut() {
    long ret = 0L;

        Cursor c = db.rawQuery("select sum(DURATION) from call where TYPE = ?", new String[] { String.valueOf(CallLog.Calls.OUTGOING_TYPE) });

        if(c.moveToNext())
        {
            try {
                Toast t = Toast.makeText(context, "" + c.getString(0) , Toast.LENGTH_SHORT);
                t.show();
                ret = Long.parseLong(c.getString(0));
            } catch (NumberFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        c.close();

    return ret;
} // end cOut()

public long cMiss() {
    long ret = 0L;

        Cursor c = db.rawQuery("select count(*) from call where TYPE = ?", new String[] { String.valueOf(CallLog.Calls.MISSED_TYPE) });

        if(c.moveToNext())
        {
            try {
                Toast t = Toast.makeText(context, "" + c.getString(0) , Toast.LENGTH_SHORT);
                t.show();
                ret = Long.parseLong(c.getString(0));
            } catch (NumberFormatException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        c.close();



        return ret;
    } // end cMiss()

} // end class

    package database;

public class CallDB {

private String ID = null ;
private String CACHED_NAME = null;
private String CACHED_NUMBER_LABEL = null ;
private String CACHED_NUMBER_TYPE = null ;
private String DATE = null ;
private String DURATION = null ;
private String NUMBER = null ;
private String TYPE = null ;

public String getID() {
    return ID;
}

public void setID(String iD) {
    ID = iD;
}

public String getCACHED_NAME() {
    return CACHED_NAME;
}

public void setCACHED_NAME(String cACHED_NAME) {
    CACHED_NAME = cACHED_NAME;
}

public String getCACHED_NUMBER_LABEL() {
    return CACHED_NUMBER_LABEL;
}

public void setCACHED_NUMBER_LABEL(String cACHED_NUMBER_LABEL) {
    CACHED_NUMBER_LABEL = cACHED_NUMBER_LABEL;
}

public String getCACHED_NUMBER_TYPE() {
    return CACHED_NUMBER_TYPE;
}

public void setCACHED_NUMBER_TYPE(String cACHED_NUMBER_TYPE) {
    CACHED_NUMBER_TYPE = cACHED_NUMBER_TYPE;
}

public String getDATE() {
    return DATE;
}

public void setDATE(String dATE) {
    DATE = dATE;
}

public String getDURATION() {
    return DURATION;
}

public void setDURATION(String dURATION) {
    DURATION = dURATION;
}

public String getNUMBER() {
    return NUMBER;
}

public void setNUMBER(String nUMBER) {
    NUMBER = nUMBER;
}

public String getTYPE() {
    return TYPE;
}

public void setTYPE(String tYPE) {
    TYPE = tYPE;
}



public CallDB() {
        // TODO Auto-generated constructor stub
    }

}

    package database;

import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.provider.CallLog;
import android.util.Log;
import android.widget.Toast;

public class CallDBHelper extends SQLiteOpenHelper {

Context context;

public static final String DATABASE_NAME = "AndroidLoggerCall" ;
public static final String DATABASE_TABLE = "call" ;
public static final int DATABASE_VERSION = 1 ;

// rows
public static final String ID = "_id";
public static final String CACHED_NAME = "CACHED_NAME";
public static final String CACHED_NUMBER_LABEL = "CACHED_NUMBER_LABEL";
public static final String CACHED_NUMBER_TYPE = "CACHED_NUMBER_TYPE";
public static final String DATE = "DATE";
public static final String DURATION = "DURATION";
public static final String NUMBER = "NUMBER";
public static final String TYPE = "TYPE";
// end rows

// create table string
    public static final String CREATE_TABLE = "create table "
            + DATABASE_TABLE + "("
            + ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"
            + CACHED_NAME + " text,"
            + CACHED_NUMBER_LABEL + " text,"
            + CACHED_NUMBER_TYPE + " text,"
            + DATE + " text,"
            + DURATION + " text,"
            + NUMBER + " text,"
            + TYPE + " text"
            + ");"  ;
// end create table


public CallDBHelper(Context context) {
    super(context, DATABASE_NAME , null, DATABASE_VERSION);
    this.context = context;
    // TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    Log.d("CallDBHelper", "onCreate");
    db.execSQL(CREATE_TABLE);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub



}

}
Srinath Ganesh
  • 2,496
  • 2
  • 30
  • 60
  • projection, selection,selectionArgs, sortOrder are set to nulls strings – Srinath Ganesh Mar 03 '13 at 16:08
  • Cursor logMain = context.getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, selection,selectionArgs, sortOrder); CURSOR IS NULL .. CANT SOLVE IT – Srinath Ganesh Mar 07 '13 at 14:23
  • I am working on something similar and able to achieve what I would like to do but the problem comes when it runs on dual sim android devices. My Code is not fetching call logs details in case of dual sim device. Can you please help me if you have any idea. – Scorpion Apr 17 '14 at 01:58
  • i saw [your post](http://stackoverflow.com/q/23115782/1897935) , Ill be able to investigate this once my exams are done . @Scorpion DID YOU TRY IN NON-JELLY BEAN DUAL SIMS ?? I have a lot of trouble(never got time to modify it) migrating from my 2.3.3/4.0 TO 4.1+ (due to additional security at content providers) – Srinath Ganesh Apr 17 '14 at 02:59
  • I have not checked it on NON-JELLY Bean dual sim but I will do that. But if you see the Call Log Monitor app on play store which I installed on my phone and its working fine. So I really don't know where is the problem. I am working on it and trying to resolve the problem.. – Scorpion Apr 17 '14 at 03:02