【问题标题】:Why does the program crash when I rename field DB_NAME or DB_TABLE?为什么我重命名字段 DB_NAME 或 DB_TABLE 时程序会崩溃?
【发布时间】:2014-11-10 03:51:28
【问题描述】:

请帮忙!

public class DB {


 private static final String DB_NAME = "mydb";
  private static final int DB_VERSION = 1;
  private static final String DB_TABLE = "mytab";

  public static final String COLUMN_ID = "_id";
  public static final String COLUMN_IMG = "img";
  public static final String COLUMN_TXT = "txt";

  private static final String DB_CREATE = 
    "create table " + DB_TABLE + "(" +
      COLUMN_ID + " integer primary key autoincrement, " +
      COLUMN_IMG + " integer, " +
      COLUMN_TXT + " text" +
    ");";

  private final Context mCtx;


  private DBHelper mDBHelper;
  private SQLiteDatabase mDB;

  public DB(Context ctx) {
    mCtx = ctx;
  }

  // открыть подключение
  public void open() {
    mDBHelper = new DBHelper(mCtx, DB_NAME, null, DB_VERSION);
    mDB = mDBHelper.getWritableDatabase();
  }

  // закрыть подключение
  public void close() {
    if (mDBHelper!=null) mDBHelper.close();
  }

  // получить все данные из таблицы DB_TABLE
  public Cursor getAllData() {
    return mDB.query(DB_TABLE, null, null, null, null, null, null);
  }

  // добавить запись в DB_TABLE
  public void addRec(String txt, int img) {
    ContentValues cv = new ContentValues();
    cv.put(COLUMN_TXT, txt);
    cv.put(COLUMN_IMG, img);
    mDB.insert(DB_TABLE, null, cv);
  }



  // класс по созданию и управлению БД
  private class DBHelper extends SQLiteOpenHelper {

    public DBHelper(Context context, String name, CursorFactory factory,
        int version) {
      super(context, name, factory, version);
    }

    // создаем и заполняем БД
    @Override
    public void onCreate(SQLiteDatabase db) {
      db.execSQL(DB_CREATE);

      ContentValues cv = new ContentValues();
      for (int i = 1; i < 5; i++) {
        cv.put(COLUMN_TXT, "sometext " + i);
        cv.put(COLUMN_IMG, R.drawable.ic_launcher);
        db.insert(DB_TABLE, null, cv);
      }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
  }
}

所以如果我在初始化时重命名字段 DB_NAME 或 DB_TABLE 就会出现错误。如果我不碰名字 - 一切都好,但我需要改变它们。试图改变模拟器 - 没有帮助。

【问题讨论】:

  • 如果您更改字段,您还必须更改版本
  • 然后发布您的 logcat .....
  • 卸载前一个并安装
  • 在 Java 代码中创建模式对我来说似乎很愚蠢。通过执行 SQL 命令创建架构,并在应用启动时准备好。
  • 09-16 11:57:28.531: W/dalvikvm(447): threadid=1: 线程以未捕获的异常退出 (group=0x40015560) 09-16 11:57:28.591: E/AndroidRuntime (447): 致命异常: main 09-16 11:57:28.591: E/AndroidRuntime(447): java.lang.RuntimeException: 无法启动活动 ComponentInfo{ru.patufedor.scbi/ru.patufedor.scbi.User} :android.database.sqlite.SQLiteException:没有这样的表:教师:,编译时:SELECT * FROM Teachers

标签: java android sqlite adapter rename


【解决方案1】:

你必须升级你的数据库的版本,所以在它上面加一个,如果你想保存你的数据库以前的信息,在你的onUpgrade中实现它:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
     //implement your logic of saving your infos here
}

如果您不介意清理数据库,请这样做:

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS '" + DATABASE_TABLE+"'");
        onCreate(db);
    }

【讨论】:

  • 按照您的建议进行了尝试。打印出这样的错误:09-16 11:57:28.591: E/AndroidRuntime(447): FATAL EXCEPTION: main 09-16 11:57:28.591: E/AndroidRuntime(447): java.lang.RuntimeException: Unable to start activity ComponentInfo{ru.patufedor.scbi/ru.patufedor.scbi.User}:android.database.sqlite.SQLiteException:没有这样的表:教师:,编译时:SELECT * FROM Teachers
  • 您是否尝试在 onUpgrade 中运行“onCreate(db)”?似乎这些表被删除但没有再次创建。您是否将 DB_VERSION 变量升级到 2?
  • 是的,我当然这样做了(你的第二个建议)@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS '" + DB_TABLE+" '"); onCreate(db); }
  • @布鲁诺佛朗哥。我不明白它是如何工作的,但我将版本更改为 3,现在它可以工作了。谢谢你,很抱歉浪费你的时间)
  • 不客气,我们在这里互相帮助。如果您可以将此答案标记为正确,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
相关资源
最近更新 更多