Возможно, локальная переменная не была инициализирована

public class DatabaseHandler extends SQLiteOpenHelper {


// All Static variables
// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "contextsManager";

// Locations table name
private static final String TABLE_LOCATIONLABLES = "locationLables";

// LOCATIONLABLES Table Columns names
private static final String KEY_LOCID = "loc_id";
private static final String KEY_LOCNAME = "loc_name";

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

// Creating Tables
@Override
public void onCreate(SQLiteDatabase db) {
    String TABLE_LOCATIONLABLES = "CREATE TABLE " + TABLE_LOCATIONLABLES + "("
            + KEY_LOCID + " INTEGER PRIMARY KEY," + KEY_LOCNAME + " TEXT,"
            +  ")";
    db.execSQL(TABLE_LOCATIONLABLES);   
}

Он говорит, что локальная переменная TABLE_LOCATIONLABLES, возможно, не была инициализирована? Он инициализируется, как происходит эта ошибка?


person user340    schedule 08.08.2012    source источник


Ответы (6)


проблема заключается в самом вашем коде

 // Creating Tables
    @Override
    public void onCreate(SQLiteDatabase db) {
        String TABLE_LOCATIONLABLES = "CREATE TABLE " + TABLE_LOCATIONLABLES + "("
                + KEY_LOCID + " INTEGER PRIMARY KEY," + KEY_LOCNAME + " TEXT,"
                +  ")";
        db.execSQL(TABLE_LOCATIONLABLES);   
    }

в oncreate(db) вы снова объявили TABLE_LOCATIONLABLES и используете его в той же строке, поэтому вы получаете Local variable may not have been initialized

просто переименуйте String TABLE_LOCATIONLABLES внутри вашего oncreate (db), как это

    @Override
    public void onCreate(SQLiteDatabase db) {
        String mQuery = "CREATE TABLE " + TABLE_LOCATIONLABLES + "("
                + KEY_LOCID + " INTEGER PRIMARY KEY," + KEY_LOCNAME + " TEXT,"
                +  ")";
        db.execSQL(mQuery);   
    }
person Akram    schedule 08.08.2012

Вы обращаетесь к TABLE_LOCATIONLABLES для создания строки. Локальная переменная имеет то же имя, что и статическая, поэтому выбирается локальная. Вы должны переименовать локальную переменную, чтобы решить эту проблему.

person Dahaka    schedule 08.08.2012

Вы объявляете TABLE_LOCATIONLABLES дважды. Один раз на уровне класса, один раз внутри процедуры onCreate. Просто удалите объявление внутри процедуры onCreate.

УДАЛИТЕ ЭТО. Я только что видел ответ ниже. Полностью упустил тот факт, что объявление вашего класса было статическим полем.

person Adam    schedule 08.08.2012

У тебя есть:

String TABLE_LOCATIONLABLES = "CREATE TABLE " + TABLE_LOCATIONLABLES + "("
     /*^^^^^^^^^^^^^^^^^^^^*/                 /*^^^^^^^^^^^^^^^^^^^^*/
        + KEY_LOCID + " INTEGER PRIMARY KEY," + KEY_LOCNAME + " TEXT,"
        +  ")";

Обратите внимание, что вы упоминаете TABLE_LOCATIONLABLES дважды! Хотя повторное использование статического имени члена может быть плохим стилем, быстрое решение будет следующим:

String TABLE_LOCATIONLABLES = "CREATE TABLE " + DatabaseHandler.TABLE_LOCATIONLABLES + "("
                                              /*^^^^^^^^^^^^^^^^*/
        + KEY_LOCID + " INTEGER PRIMARY KEY," + KEY_LOCNAME + " TEXT,"
        +  ")";

(PS: пишется LABELS, а не LABLES!)

person Ken Y-N    schedule 08.08.2012

В методе OnCreate() вы пытаетесь получить доступ к переменной, которая является переменной экземпляра, но на самом деле она обращается только к переменной локального метода. Я предлагаю вам обновить свой код следующим образом, чтобы он наверняка работал,

public void onCreate(SQLiteDatabase db) {
    String TBL_LOCATIONLABLES = "CREATE TABLE " + TABLE_LOCATIONLABLES + "("
            + KEY_LOCID + " INTEGER PRIMARY KEY," + KEY_LOCNAME + " TEXT,"
            +  ")";
    db.execSQL(TBL_LOCATIONLABLES);   
}
person Lucifer    schedule 08.08.2012

У вас есть одна статическая переменная с именем TABLE_LOCATIONLABLES. В вашем методе onCreate вы инициализируете переменную с тем же именем — до сих пор проблем не было. Но в вашем операторе String TABLE_LOCATIONLABLES = "CREATE TABLE " + TABLE_LOCATIONLABLES + "(" + KEY_LOCID + " INTEGER PRIMARY KEY," + KEY_LOCNAME + " TEXT," + ")";¸ вы обращаетесь к локальной переменной TABLE_LOCATIONLABLES! Хотя вы инициализируете свою локальную переменную, присваивая ее в своем выражении, где в данный момент локальная переменная не инициализирована.

Я думаю, вы пытались получить доступ к своей статической переменной, поэтому вам нужно получить к ней доступ, как DatabaseHandler.TABLE_LOACATIONLABLES.

Замените свое старое утверждение следующим: String TABLE_LOCATIONLABLES = "CREATE TABLE " + DatabaseHandler.TABLE_LOCATIONLABLES + "(" + DatabaseHandler.KEY_LOCID + " INTEGER PRIMARY KEY," + DatabaseHandler.KEY_LOCNAME + " TEXT," + ")";¸

Небольшой совет: получайте доступ к своим переменным, если они являются членами или статическими, через это, и поэтому легче увидеть, где создаются экземпляры переменных.

Приветствует

person sascha10000    schedule 08.08.2012