Question

I am making a Twitter client as a practice run in learning Android, and the login and timeline activities work fine, but when I click on Action Bar icon, it takes me to a ComposeTweetActivity.java, and after I enter text (my tweet) and press the Tweet button to compose a tweet, it does not do anything (it is supposed to actually upload it to my Twitter account and then return me to my TimelineActivity.java). In the console, it gives me the error:

04-14 18:10:34.797: E/SQLiteLog(998): (1) no such table: Users

04-14 18:10:34.805: E/SQLiteDatabase(998): android.database.sqlite.SQLiteException: no such table: Users (code 1): , while compiling: INSERT INTO Users(user_name,friends_count,profile_background_image_url,Tweet,user_id,screen_name,Id,tweet_count,profile_image_url,followers_count) VALUES (?,?,?,?,?,?,?,?,?,?)

plus many other errors as a result of this. My guess is it has to do something with Active Android, which is the database I'm using to save. I have many, many files with this project, but I will post the ComposeTweetActivity.java since it has the compose tweet button (which causes all the errors) and the User.java and Tweet.java which are models for Active Android (I think?) with all of the table data, and the Console with all the errors. If you need me to post more files, happy to oblige. Thank you very much for your help, in advance.

ComposeTweetActivity.java

package com.codepath.apps.mytwitterapp;

import org.json.JSONObject;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.codepath.apps.mytwitterapp.models.Tweet;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.JsonHttpResponseHandler;
import com.nostra13.universalimageloader.core.ImageLoader;

public class ComposeTweetActivity extends ActionBarActivity {

    private Button    btnCancel,
                      btnTweet;
    private ImageView ivUserImage;
    private TextView  tvUserName;
    private EditText  etNewTweet;

    private boolean   alreadyToasted = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_compose_tweet);

        setupButtons();
        setupImageView();
        setupTextView();
        setupEditText();
    }

    private void setupButtons() {
        btnCancel = (Button) findViewById(R.id.btnCancel); 
        btnCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                setResult(RESULT_CANCELED, i);
                finish(); 
            }
        });

        btnTweet = (Button) findViewById(R.id.btnTweet); 
        btnTweet.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String tweetBody = etNewTweet.getText().toString();
                tweet(tweetBody);
            }
        }); 
    }

    private void setupImageView() {
        ivUserImage = (ImageView) findViewById(R.id.ivUserImage);
        Log.d("DEBUG", "TimelineActivity.sScreenName is: " + TimelineActivity.getScreenName());
        Log.d("DEBUG", "TimelineActivity.sImageUrl just before execution of "
                     + "ImageLoader.getInstance().displayImage(mImageUrl, mIvUserImage) is: " 
                     + TimelineActivity.getUserImageUrl());
        ImageLoader.getInstance().displayImage(TimelineActivity.getUserImageUrl(), ivUserImage);
    }

    private void setupTextView() {
        tvUserName = (TextView) findViewById(R.id.tvUserName); 
        tvUserName.setText("@" + TimelineActivity.getScreenName()); 
    }

    private void setupEditText() {
        etNewTweet = (EditText) findViewById(R.id.etNewTweet);  

        // Show soft keyboard when EditText field requests focus
        if (etNewTweet.requestFocus()) {
            InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            mgr.showSoftInput(etNewTweet, InputMethodManager.SHOW_IMPLICIT); 
        }

        etNewTweet.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (!alreadyToasted && s.length() == 140) {
                    Toast.makeText(ComposeTweetActivity.this, "You've reached the 140 character"
                            + " limit", Toast.LENGTH_LONG).show(); 
                    alreadyToasted = true; 
                }
                else if (s.length() > 140) {
                    etNewTweet.setTextColor(Color.RED); 
                } else {
                    etNewTweet.setTextColor(Color.BLACK); 
                }
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) { }

            @Override
            public void afterTextChanged(Editable s) { }
        });

    }

    private void tweet(String tweetBody) {
        MyTwitterApp.getRestClient().postTweet(tweetBody, new JsonHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, JSONObject jsonTweetResponse) {
                Log.d("DEBUG", "Called onSuccess() in tweet()."); 
                Tweet newTweet = Tweet.fromJson(jsonTweetResponse); 
                new AsyncTweetSave().execute(newTweet); 
                Intent i = new Intent();
                i.putExtra("new_tweet", newTweet);
                setResult(RESULT_OK, i);
                finish(); 
            }   

            @Override
            public void onFailure(Throwable e, JSONObject error) {
                Log.d("DEBUG", "Called onFailure() in getUserScreenName(). Failure message: " 
                                + AsyncHttpResponseHandler.FAILURE_MESSAGE);
                Log.e("ERROR", e.getMessage());
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.compose_tweet, menu);
        return true;
    }
}

User.java

package com.codepath.apps.mytwitterapp.models;

import java.io.Serializable;
import java.util.List;

import org.json.JSONException;
import org.json.JSONObject;

import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;
import com.codepath.apps.mytwitterapp.UserAccountSettings;
import com.codepath.apps.mytwitterapp.UserInfo;

/**
 * Class acts as a Java-representation of a single user retrieved as a JSONObject from the 
 * Twitter REST API v1.1. Fields are as specified in the API Users object documentation. 
 */
@Table(name = "Users")
public class User extends Model implements Serializable {

    @Column(name = "user_name")
    private String name;
    @Column(name = "user_id", unique = true, onUniqueConflict = Column.ConflictAction.REPLACE)
    private long   userId;                      // User ID
    @Column(name = "screen_name")
    private String screenName;
    @Column(name = "profile_image_url")
    private String profileImageUrl;
    @Column(name = "profile_background_image_url")
    private String profileBackgroundImageUrl;               
    @Column(name = "tweet_count")
    private int    tweetCount;                  // Referred to as statuses_count in Twitter API
    @Column(name = "followers_count")
    private int    followersCount;
    @Column(name = "friends_count") 
    private int    friendsCount;

    @Column(name = "Tweet")                     // Created for ActiveAndroid to establish a direct  
    private Tweet  tweet;                       // relationship with the Tweets table

    public User() {                             // Empty-argument constructor required by ActiveAndroid
        super(); 
    }

    public String getName() {
        return name;
    }

    public long getUserId() {
        return userId;
    }

    public String getScreenName() {
        return screenName;
    }

    public String getProfileImageUrl() {
        return profileImageUrl;
    }

    public String getProfileBackgroundImageUrl() {
        return profileBackgroundImageUrl;
    }

    public int getNumTweets() {
        return tweetCount;
    }

    public int getFollowersCount() {
        return followersCount;
    }

    public int getFriendsCount() {
        return friendsCount;
    }

    // Optional helper method for ActiveAndroid to establish a direct relationship with the 
    // UserAccountSettings table
    public List<UserAccountSettings> getUserAccountSettings() {
        return getMany(UserAccountSettings.class, "Users");
    }

    // Optional helper method for ActiveAndroid to establish a direct relationship with the 
    // UserInfo table
    public List<UserInfo> getUserInfo() {
        return getMany(UserInfo.class, "Users");
    }

    public static User fromJson(JSONObject jsonObject) {
        User u = new User();
        try {
            u.name                   = jsonObject.getString("name");
            u.userId                         = jsonObject.getLong("id");
            u.screenName                 = jsonObject.getString("screen_name");
            u.profileImageUrl            = jsonObject.getString("profile_image_url");
            u.profileBackgroundImageUrl = jsonObject.getString("profile_background_image_url");
            u.tweetCount                 = jsonObject.getInt("statuses_count");
            u.followersCount             = jsonObject.getInt("followers_count");
            u.friendsCount           = jsonObject.getInt("friends_count");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return u;
    }
}

Tweet.java

package com.codepath.apps.mytwitterapp.models;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

import com.activeandroid.ActiveAndroid;
import com.activeandroid.Model;
import com.activeandroid.annotation.Column;
import com.activeandroid.annotation.Table;

/**
 * Class acts as a Java-representation of a single tweet retrieved as a JSONObject from the 
 * Twitter REST API v1.1. Fields are as specified in the API Tweets object documentation. 
 */
@Table(name = "Tweets")
public class Tweet extends Model implements Serializable {

    @Column(name = "max_id")
    private static long maxId;  // ID of the last (ie, earliest-timestamped) tweet to be processed in the current JSONArray

    @Column(name = "tweet_id", unique = true, onUniqueConflict = Column.ConflictAction.REPLACE)
    private long        tweetId;    // Tweet ID
    @Column(name = "created_at")
    private String      createdAt; 
    @Column(name = "tweet_body")
    private String      body;
    @Column(name = "favorited")
    private boolean     favorited;
    @Column(name = "retweeted")
    private boolean     retweeted;
    @Column(name = "user")
    private User        user;

    public Tweet() {                // Empty-argument constructor required by ActiveAndroid
        super(); 
    }   

    public static long getMaxId() {
        return maxId;
    }

    public static String getMaxIdAsString() {
        return String.valueOf(maxId);
    }

    public static void decrementMaxId() {
        maxId -= 1; 
    }

    public long getTweetId() {
        return tweetId;
    }

    public String getCreatedAt() {
        return createdAt;
    }

    public String getBody() {
        return body;
    }

    public boolean isFavorited() {
        return favorited;
    }

    public boolean isRetweeted() {
        return retweeted;
    }

    public User getUser() {
        return user;
    }

    // Optional helper method for ActiveAndroid to establish a direct relationship with the Users table
    public List<User> getUsers() {
        return getMany(User.class, "Tweets");
    }

    public static Tweet fromJson(JSONObject jsonObject) {
        Tweet tweet = new Tweet();
        try {
            tweet.tweetId        = jsonObject.getLong("id");
            tweet.createdAt = jsonObject.getString("created_at");
            tweet.body   = jsonObject.getString("text");
            tweet.favorited = jsonObject.getBoolean("favorited");
            tweet.retweeted = jsonObject.getBoolean("retweeted");
            tweet.user   = User.fromJson(jsonObject.getJSONObject("user"));
        } catch (JSONException e) {
            e.printStackTrace();
            return null;
        }
        return tweet;
    }

    public static ArrayList<Tweet> fromJson(JSONArray jsonArray) {
        ArrayList<Tweet> tweets = new ArrayList<Tweet>(jsonArray.length());

        for (int i=0; i < jsonArray.length(); i++) {
            JSONObject tweetJson = null;
            try {
                tweetJson = jsonArray.getJSONObject(i);
            } catch (Exception e) {
                e.printStackTrace();
                continue;
            }

            Tweet tweet = Tweet.fromJson(tweetJson);
            if (tweet != null) {
                maxId = tweet.getTweetId();
                tweets.add(tweet);
            }

        }
        return tweets;
    }

    public static void saveTweet(Tweet tweet) {
        tweet.user.save();
        tweet.save();
    }

    public static void saveTweets(ArrayList<Tweet> tweets) {
        ActiveAndroid.beginTransaction();
        try {
            for (int i = 0; i < tweets.size(); i++) {
                Tweet t = tweets.get(i);
                Log.d("DEBUG", "Inside saveTweets(ArrayList<Tweet>), current tweet is: "  + t.toString());
                if (t != null) {
                    if (t.user != null) {
                        t.user.save();
                    } 
                    t.save(); 
                }
            }
            ActiveAndroid.setTransactionSuccessful();
        } finally {
            ActiveAndroid.endTransaction(); 
        }
    } 
}

The Console full of errors:

 04-14 18:10:26.401: D/dalvikvm(998): GC_CONCURRENT freed 261K, 4% free 8611K/8967K, paused 10ms+1ms, total 16ms
    04-14 18:10:26.745: D/dalvikvm(998): GC_CONCURRENT freed 353K, 5% free 8646K/9095K, paused 11ms+1ms, total 17ms
    04-14 18:10:26.893: D/DEBUG(998): Called UserAccountSettings.fromJson(...). mScreenName is: noniazure
    04-14 18:10:27.409: D/dalvikvm(998): GC_FOR_ALLOC freed 188K, 6% free 8683K/9159K, paused 2ms, total 3ms
    04-14 18:10:27.409: D/dalvikvm(998): GC_FOR_ALLOC freed 140K, 7% free 8673K/9287K, paused 3ms, total 3ms
    04-14 18:10:27.417: D/dalvikvm(998): GC_FOR_ALLOC freed 3K, 6% free 8790K/9287K, paused 4ms, total 4ms
    04-14 18:10:27.417: I/dalvikvm-heap(998): Grow heap (frag case) to 8.726MB for 117780-byte allocation
    04-14 18:10:27.417: D/dalvikvm(998): GC_FOR_ALLOC freed 182K, 8% free 8722K/9415K, paused 3ms, total 3ms
    04-14 18:10:27.445: D/dalvikvm(998): GC_CONCURRENT freed 134K, 5% free 8972K/9415K, paused 11ms+1ms, total 14ms
    04-14 18:10:27.473: D/OpenGLRenderer(998): TextureCache::get: create texture(0xb7d591e8): name, size, mSize = 92, 4, 1127492
    04-14 18:10:27.493: D/dalvikvm(998): GC_CONCURRENT freed 332K, 5% free 9053K/9479K, paused 12ms+1ms, total 16ms
    04-14 18:10:27.513: D/OpenGLRenderer(998): TextureCache::get: create texture(0xb7d9fc78): name, size, mSize = 95, 9216, 1136708
    04-14 18:10:27.513: D/OpenGLRenderer(998): TextureCache::get: create texture(0xb7d9f130): name, size, mSize = 96, 9216, 1145924
    04-14 18:10:27.525: D/OpenGLRenderer(998): TextureCache::get: create texture(0xb7d8b9c8): name, size, mSize = 98, 9216, 1155140
    04-14 18:10:27.529: D/OpenGLRenderer(998): TextureCache::get: create texture(0xb7e2eb40): name, size, mSize = 99, 9216, 1164356
    04-14 18:10:34.145: D/OpenGLRenderer(998): TextureCache::get: create texture(0xb7d68d78): name, size, mSize = 101, 324, 1164680
    04-14 18:10:34.229: D/dalvikvm(998): GC_FOR_ALLOC freed 536K, 8% free 8745K/9479K, paused 3ms, total 3ms
    04-14 18:10:34.237: I/dalvikvm-heap(998): Grow heap (frag case) to 9.449MB for 921612-byte allocation
    04-14 18:10:34.249: D/dalvikvm(998): GC_CONCURRENT freed 4K, 8% free 9641K/10439K, paused 10ms+0ms, total 14ms
    04-14 18:10:34.261: D/DEBUG(998): TimelineActivity.sScreenName is: noniazure
    04-14 18:10:34.261: D/DEBUG(998): TimelineActivity.sImageUrl just before execution of ImageLoader.getInstance().displayImage(mImageUrl, mIvUserImage) is: null
    04-14 18:10:34.297: W/EGL_emulation(998): eglSurfaceAttrib not implemented
    04-14 18:10:34.313: D/OpenGLRenderer(998): TextureCache::get: create texture(0xb7d34e68): name, size, mSize = 104, 9216, 1173896
    04-14 18:10:34.337: D/OpenGLRenderer(998): TextureCache::get: create texture(0xb7d64d60): name, size, mSize = 109, 100, 1173996
    04-14 18:10:34.677: D/DEBUG(998): Inside saveTweets(ArrayList<Tweet>), current tweet is: Tweets@null
    04-14 18:10:34.677: E/SQLiteLog(998): (1) no such table: Users
    04-14 18:10:34.677: E/SQLiteDatabase(998): Error inserting user_name=Forbes Tech News friends_count=16449 profile_background_image_url=http://pbs.twimg.com/profile_background_images/92775085/twitter-background.jpg Tweet=null user_id=14885549 screen_name=ForbesTech Id=null tweet_count=41653 profile_image_url=http://pbs.twimg.com/profile_images/828527305/technology_normal.jpg followers_count=1154679
    04-14 18:10:34.677: E/SQLiteDatabase(998): android.database.sqlite.SQLiteException: no such table: Users (code 1): , while compiling: INSERT INTO Users(user_name,friends_count,profile_background_image_url,Tweet,user_id,screen_name,Id,tweet_count,profile_image_url,followers_count) VALUES (?,?,?,?,?,?,?,?,?,?)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.activeandroid.Model.save(Unknown Source)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.codepath.apps.mytwitterapp.models.Tweet.saveTweets(Tweet.java:137)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.codepath.apps.mytwitterapp.AsyncTweetsSave.doInBackground(AsyncTweetsSave.java:17)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.codepath.apps.mytwitterapp.AsyncTweetsSave.doInBackground(AsyncTweetsSave.java:1)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.lang.Thread.run(Thread.java:856)
    04-14 18:10:34.677: E/SQLiteLog(998): (1) no such table: Tweets
    04-14 18:10:34.677: E/SQLiteDatabase(998): Error inserting retweeted=false max_id=455761612532891649 favorited=false tweet_id=455769106550382593 created_at=Mon Apr 14 18:06:37 +0000 2014 tweet_body=CCP shuts down their in-development 'World of Darkness' MMO http://t.co/wZv6woImaZ Id=null user=-1
    04-14 18:10:34.677: E/SQLiteDatabase(998): android.database.sqlite.SQLiteException: no such table: Tweets (code 1): , while compiling: INSERT INTO Tweets(retweeted,max_id,favorited,tweet_id,created_at,tweet_body,Id,user) VALUES (?,?,?,?,?,?,?,?)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.activeandroid.Model.save(Unknown Source)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.codepath.apps.mytwitterapp.models.Tweet.saveTweets(Tweet.java:139)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.codepath.apps.mytwitterapp.AsyncTweetsSave.doInBackground(AsyncTweetsSave.java:17)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.codepath.apps.mytwitterapp.AsyncTweetsSave.doInBackground(AsyncTweetsSave.java:1)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.lang.Thread.run(Thread.java:856)
    04-14 18:10:34.677: D/DEBUG(998): Inside saveTweets(ArrayList<Tweet>), current tweet is: Tweets@null
    04-14 18:10:34.677: E/SQLiteLog(998): (1) no such table: Users
    04-14 18:10:34.677: E/SQLiteDatabase(998): Error inserting user_name=Gizmodo friends_count=77 profile_background_image_url=http://pbs.twimg.com/profile_background_images/436934792/gizmodo-twitter-background-final.jpg Tweet=null user_id=2890961 screen_name=Gizmodo Id=null tweet_count=24648 profile_image_url=http://pbs.twimg.com/profile_images/1860214036/Gizmodo-Twitter-Avatar_normal.jpeg followers_count=887873
    04-14 18:10:34.677: E/SQLiteDatabase(998): android.database.sqlite.SQLiteException: no such table: Users (code 1): , while compiling: INSERT INTO Users(user_name,friends_count,profile_background_image_url,Tweet,user_id,screen_name,Id,tweet_count,profile_image_url,followers_count) VALUES (?,?,?,?,?,?,?,?,?,?)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.activeandroid.Model.save(Unknown Source)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.codepath.apps.mytwitterapp.models.Tweet.saveTweets(Tweet.java:137)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.codepath.apps.mytwitterapp.AsyncTweetsSave.doInBackground(AsyncTweetsSave.java:17)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at com.codepath.apps.mytwitterapp.AsyncTweetsSave.doInBackground(AsyncTweetsSave.java:1)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    04-14 18:10:34.677: E/SQLiteDatabase(998):  at java.lang.Thread.run(Thread.java:856)
    04-14 18:10:34.677: E/SQLiteLog(998): (1) no such table: Tweets
    04-14 18:10:34.677: E/SQLiteDatabase(998): Error inserting retweeted=false max_id=455761612532891649 favorited=false tweet_id=455769104461594624 created_at=Mon Apr 14

.. and on and on and on ...

The layout for ComposeTweetActivity:

activity_compose_tweet.xml

Was it helpful?

Solution

Goodness, the answer ended up being a error in the emulator. It turns out that a Twitter client that uses a model to draw from the Twitter API (I was using Active Android, but you could also just use the raw SQLite database tables)... will only populate data if the table has not been drawn already. So in my case, making lots of changes and re-running the app a bunch, means you are asking to repopulate and create a data table, but it has already been created.

So the solution is to uninstall the app in your emulator (or simply use a fresh emulator) and re-run the program again! This will create it again from scratch, which is what your code asks for. It worked like a charm. So simple, yet so tricky. >_<

OTHER TIPS

you can test with my method add to AndroidManifest.xml:

<meta-data android:name="AA_MODELS" android:value="com.codepath.apps.mytwitterapp.models.User, com.codepath.apps.mytwitterapp.models.Tweet" />

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top