Frage

Ich habe ein Problem damit, dass mein SQLite in dieser Android-Anwendung, die ich entwickle, ordnungsgemäß funktioniert.Es scheint, als ob die Tabelle basierend auf den LogCat-Nachrichten nicht ordnungsgemäß erstellt wird.Ich habe das Gefühl, ich habe zu lange auf den Bildschirm gestarrt.Kann hier jemand das Problem in meinem Code erkennen?

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBHelper extends SQLiteOpenHelper {

    // table name
    public static final String TABLE_JOKES = "jokes";

    // database field names
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_CATEGORY = "category";
    public static final String COLUMN_SUBCATEGORY = "subcategory";
    public static final String COLUMN_JOKE_TYPE = "jokeType";
    public static final String COLUMN_DESCRIPTION = "description";
    public static final String COLUMN_QUESTION_TEXT = "questionText";
    public static final String COLUMN_ANSWER_TEXT = "answerText";
    public static final String COLUMN_MONOLOGUE_TEXT = "monologueText";
    public static final String COLUMN_RATING_SCALE = "ratingScale";
    public static final String COLUMN_COMMENTS = "comments";
    public static final String COLUMN_JOKE_SOURCE = "jokeSource";
    public static final String COLUMN_RELEASE_STATUS = "releaseStatus";
    public static final String COLUMN_CREATED = "created";
    public static final String COLUMN_MODIFIED = "modified";

    private static final String DATABASE_NAME = "jokes.db"; // file name
    private static final int DATABASE_VERSION = 1;

    // Database creation raw SQL statement
    private static final String DATABASE_CREATE = "create table " + TABLE_JOKES
            + "( " + COLUMN_ID + " integer primary key autoincrement, "
            + COLUMN_CATEGORY + " text not null, " + COLUMN_SUBCATEGORY
            + " text not null, " + COLUMN_JOKE_TYPE + " integer not null, "
            + COLUMN_DESCRIPTION + " text," + COLUMN_QUESTION_TEXT + "text,"
            + COLUMN_ANSWER_TEXT + "text," + COLUMN_MONOLOGUE_TEXT + "text,"
            + COLUMN_RATING_SCALE + "integer," + COLUMN_COMMENTS + "text,"
            + COLUMN_JOKE_SOURCE + "text," + COLUMN_RELEASE_STATUS + "integer,"
            + COLUMN_CREATED + "text," + COLUMN_MODIFIED + "text" + ");";

    // static instance to share DBHelper
    private static DBHelper dbHelper = null;
    private SQLiteDatabase db ;

    /**
     * Constructor
     * 
     * @param context
     * @param name
     * @param factory
     * @param version
     */
    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        db = getWritableDatabase();
    }

    /**
     * This is a static method that makes sure that only one database helper
     * exists across the app's lifecycle
     * 
     * @param context
     * @return
     */
    public static DBHelper getDBHelper(Context context) {
        if (dbHelper == null) {
            dbHelper = new DBHelper(context.getApplicationContext());
        }
        return dbHelper;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite
     * .SQLiteDatabase)
     */
    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DATABASE_CREATE);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite
     * .SQLiteDatabase, int, int)
     */
    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) {
        Log.w(DBHelper.class.getName(), "Upgrading database from version "
                + oldVersion + " to " + newVersion);
    }

    /**
     * CRUD - Update
     * 
     * @param category
     * @param subcategory
     * @param jokeType
     * @param description
     * @param questionText
     * @param answerText
     * @param monologueText
     * @param comments
     * @param jokeSource
     * @param ratingScale
     * @param releaseStatus
     * @return
     */
    public long insertNewJoke(String category, String subcategory,
            int jokeType, String description, String questionText,
            String answerText, String monologueText, String comments,
            String jokeSource, int ratingScale, int releaseStatus) {
        ContentValues cv = new ContentValues();
        cv.put(COLUMN_CATEGORY, category);
        cv.put(COLUMN_SUBCATEGORY, subcategory);
        cv.put(COLUMN_JOKE_TYPE, jokeType);
        cv.put(COLUMN_DESCRIPTION, description);
        cv.put(COLUMN_QUESTION_TEXT, questionText);
        cv.put(COLUMN_ANSWER_TEXT, answerText);
        cv.put(COLUMN_MONOLOGUE_TEXT, monologueText);
        cv.put(COLUMN_COMMENTS, comments);
        cv.put(COLUMN_JOKE_SOURCE, jokeSource);
        cv.put(COLUMN_RATING_SCALE, ratingScale);
        cv.put(COLUMN_RELEASE_STATUS, releaseStatus);
        cv.put(COLUMN_CREATED, ""); // how to put date??
        cv.put(COLUMN_CREATED, "");

        long code = getWritableDatabase().insert(TABLE_JOKES, null, cv);
        return code;
    }

    /**
     * CRUD - Retrieve
     * 
     * @return
     */
    public Cursor getJokes() {
        String[] columns = { COLUMN_CATEGORY, COLUMN_SUBCATEGORY,
                COLUMN_JOKE_TYPE, COLUMN_DESCRIPTION, COLUMN_ANSWER_TEXT,
                COLUMN_MONOLOGUE_TEXT, COLUMN_RATING_SCALE, COLUMN_COMMENTS,
                COLUMN_JOKE_SOURCE, COLUMN_RELEASE_STATUS, COLUMN_CREATED,
                COLUMN_MODIFIED }; // might need the _id column
        return getWritableDatabase().query(TABLE_JOKES, columns, null, null,
                null, null, null);
    }

    /**
     * CRUD - Delete
     * 
     * @param id
     */
    public void deleteJoke(int id) {
        getWritableDatabase().delete(TABLE_JOKES, COLUMN_ID + "=?",
                new String[] { String.valueOf(id) });
    }

}

Also versuche ich in onCreate () (in meiner Hauptaktivität), einen neuen Datensatz in die Datenbank einzufügen und ihn dann in einen Cursor abzurufen.Es scheint jedoch bei der Einfügeanweisung hängen zu bleiben.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // the projection (fields from the database that we want to use)
        String from[] = { DBHelper.COLUMN_DESCRIPTION };
        // matching fields on the layout to be used with the adapter
        int to[] = { R.id.tv1 };

        setContentView(R.layout.activity_main);

        lv = (ListView) findViewById(R.id.lvMainJokes);
        dbHelper = DBHelper.getDBHelper(this);

        long code = dbHelper.insertNewJoke("Holiday", "", 2, "Joke 1 Description", "", "",
                "joke", "", "", 5, 1);

        if (code != -1)
        cursor = dbHelper.getJokes();
...

Hier ist die LogCat-Ausgabe:

11-15 15:19:08.040: I/Choreographer(1016): Skipped 45 frames!  The application may be doing too much work on its main thread.
11-15 15:19:35.358: D/dalvikvm(1064): GC_FOR_ALLOC freed 58K, 4% free 2726K/2836K, paused 42ms, total 45ms
11-15 15:19:35.368: I/dalvikvm-heap(1064): Grow heap (frag case) to 3.315MB for 635812-byte allocation
11-15 15:19:35.438: D/dalvikvm(1064): GC_FOR_ALLOC freed 2K, 4% free 3344K/3460K, paused 63ms, total 63ms
11-15 15:19:35.548: E/SQLiteLog(1064): (1) table jokes has no column named releaseStatus
11-15 15:19:35.568: E/SQLiteDatabase(1064): Error inserting category=Holiday releaseStatus=1 jokeType=2 created= monologueText=joke description=Joke 1 Description subcategory= answerText= questionText= jokeSource= ratingScale=5 comments=
11-15 15:19:35.568: E/SQLiteDatabase(1064): android.database.sqlite.SQLiteException: table jokes has no column named releaseStatus (code 1): , while compiling: INSERT INTO jokes(category,releaseStatus,jokeType,created,monologueText,description,subcategory,answerText,questionText,jokeSource,ratingScale,comments) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at com.teamdotgetname.android.phase1.jokeapplication.persistence.DBHelper.insertNewJoke(DBHelper.java:143)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at com.teamdotgetname.android.phase1.jokeapplication.presentation.MainActivity.onCreate(MainActivity.java:53)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.app.Activity.performCreate(Activity.java:5133)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.os.Looper.loop(Looper.java:137)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at android.app.ActivityThread.main(ActivityThread.java:5103)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at java.lang.reflect.Method.invokeNative(Native Method)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at java.lang.reflect.Method.invoke(Method.java:525)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-15 15:19:35.568: E/SQLiteDatabase(1064):     at dalvik.system.NativeStart.main(Native Method)
11-15 15:19:35.798: I/Choreographer(1064): Skipped 42 frames!  The application may be doing too much work on its main thread.
11-15 15:19:35.868: D/gralloc_goldfish(1064): Emulator without GPU emulation detected.

Danke, dass du einen Blick darauf geworfen hast.

War es hilfreich?

Lösung

Auf einen Blick sieht Ihr Code gut aus.Ausnahme:

    android.database.sqlite.SQLiteException: table jokes has no column named releaseStatus (code 1)

scheint falsch zu sein, weil Sie eindeutig das erstellen releaseStatus spalte in Ihrer Erstellungstabelle DATABASE_CREATE Zeichenfolge.Ich bin auf ein Problem gestoßen, bei dem ich das Schema meiner Datenbank geändert habe und die Änderungen in meiner Anwendung nicht wirksam wurden, weil ich das nicht erhöht habe DATABASE_VERSION.

Ihre Optionen zum Ausprobieren, die alle dazu führen, dass die Datenbank neu erstellt wird, sind:

  1. Löschen Sie die Anwendungsdaten über die Einstellungen apk
  2. Deinstallieren Sie Ihre Anwendung manuell und installieren Sie sie dann neu.(Nur laufen gradle installDebug oder die Installation Ihrer App durch Eclipse ist nicht gut genug.)
  3. Erhöhen Sie Ihre DATABASE_VERSION Wert

Andere Tipps

Ich würde sagen, dass Sie im Create-Anweisungsraum Platz benötigen. Start: column_question_text + "text" in column_question_text + "text".

Es sieht aus, als hätten Sie keine Räume zwischen den Spaltennamen und den Säulentypen.Versuchen Sie das.

generasacodicetagpre.

In der Datenbank Fehler erstellen "integer," + Spaltenkommentare + "Text", ".Kein separater Raum.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top