jsmos
jsmos

Reputation: 497

SQLiteException near "CREATE"

I have multiple tables in one database (token and tweets). The token table works fine and I can insert and update stuff correctly, but my tweets table throws an error (SQLiteException near "CREATE") though it looks like I have everything typed in correctly. I've tried deleting the app from my phone and starting over, but it just refuses to insert in my for loop.

Here's my doInBackground method that gets tweets from the user's timeline and tries to store it in the tweets table: List responseList = twitter.getHomeTimeline(page);

            for (twitter4j.Status status : responseList)
            {               
                int rt_amount = status.getRetweetCount(); 
                String rt = Integer.toString(rt_amount);

                String username          = status.getUser().getScreenName(); 
                String profile_image_url = status.getUser().getProfileImageURL(); 
                String message           = status.getText(); 

                int  favoriteCount       = status.getFavoriteCount(); 
                String favCount          = Integer.toString(favoriteCount);

                String name = status.getUser().getName(); 

                String createdTime = status.getCreatedAt().toGMTString();       

                storeTweet.storeTweet(message, username, name, rt, createdTime, profile_image_url, favCount, "hi"); 
            }

String CREATE_TWEETS_TABLE = "CREATE TABLE " + TABLE_TWEETS + 
"("
        + T_COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + T_MESSAGE + " TEXT," 
        + T_RETWEET_COUNT + " TEXT," + T_FAVORITE_COUNT + " TEXT," + T_USER + " TEXT," 
        + T_REAL_SCREENNAME + " TEXT," + T_MEDIA_URIS + " TEXT," + T_PROFILE_URL + " TEXT," + T_CREATED_TIME + " TEXT)";

onCreate:

@Override
public void onCreate(SQLiteDatabase database)
{ 
    database.execSQL(CREATE_TOKENS_TABLE);
    database.execSQL(CREATE_TWEETS_TABLE);
}

addTweet:

public void addTweet(Tweet tweet)
{ 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues values = new ContentValues();

    values.put(T_MESSAGE, tweet.getMessage());
    values.put(T_FAVORITE_COUNT, tweet.getFavoriteCount());
    values.put(T_RETWEET_COUNT, tweet.getRtCount());
    values.put(T_USER, tweet.getUsername());
    values.put(T_REAL_SCREENNAME, tweet.getRealName());
    values.put(T_MEDIA_URIS, tweet.getMediaUris());
    values.put(T_PROFILE_URL, tweet.getProfileImageUrl());
    values.put(T_CREATED_TIME, tweet.getCreatedTime());

    db.insertOrThrow(CREATE_TWEETS_TABLE, null, values);

    db.close();
}

StoreTweet.java:

public class StoreTweet 
{
    private DBHelper db; 
    private Context context;  

    public StoreTweet(Context context){ 
        this.context = context; 
    }

    public void storeTweet(String message, String username, String realName, String rtCount, String createdTime, 
            String profileImageUrl, String favoriteCount, String mediaUris)
    { 
        db = new DBHelper(context);
        db.addTweet(new Tweet(message, username, realName, rtCount, createdTime, profileImageUrl, favoriteCount, mediaUris));
    }
}

Stacktrace:

05-27 20:06:05.585: E/AndroidRuntime(26840): Caused by: android.database.sqlite.SQLiteException: near "CREATE": syntax error (code 1): , while compiling: INSERT INTO CREATE TABLE tweets(_id INTEGER PRIMARY KEY AUTOINCREMENT,message TEXT,retweet_count TEXT,favorite_count TEXT,user TEXT,screenname TEXT,media_uris TEXT,profile_img_url TEXT,created_time TEXT)(message,profile_img_url,screenname,media_uris,retweet_count,favorite_count,created_time,user) VALUES (?,?,?,?,?,?,?,?)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1365)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at util.DBHelper.addTweet(DBHelper.java:148)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at twitter.StoreTweet.storeTweet(StoreTweet.java:21)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at twitter.TWTimelineFrag$GetTwitterTimeline.doInBackground(TWTimelineFrag.java:127)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at twitter.TWTimelineFrag$GetTwitterTimeline.doInBackground(TWTimelineFrag.java:1)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-27 20:06:05.585: E/AndroidRuntime(26840):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
05-27 20:06:05.585: E/AndroidRuntime(26840):    ... 4 more

Upvotes: 0

Views: 124

Answers (2)

CL.
CL.

Reputation: 180020

The first parameter of insertOrThrow must be the table name (TABLE_TWEETS), not the statement that creates the entire table (CREATE_TWEETS_TABLE).

Upvotes: 0

CommonsWare
CommonsWare

Reputation: 1006604

You do not execute a CREATE TABLE statement via insertOrThrow() -- that is adding INSERT INTO into your SQL statement. Use execSQL() instead.

Upvotes: 3

Related Questions