When I click on the ADD button, I get the following crash:

05-17 12:34:22.539 2336-2336/menutest.apps.alexbykov.ru.bd E/SQLiteLog: (1) table contacts has no column named position 05-17 12:34:22.541 2336-2336/menutest.apps.alexbykov.ru.bd E/SQLiteDatabase: Error inserting name=1 position=1 mail=1 android.database.sqlite.SQLiteException: table contacts has no column named position (code 1): , while compiling: INSERT INTO contacts(name,position,mail) VALUES (?,?,?) at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469) at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341) at menutest.apps.alexbykov.ru.bd.MainActivity.onClick(MainActivity.java:69) at android.view.View.performClick(View.java:5198) at android.view.View$PerformClick.run(View.java:21147) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

The reason is in the column "position", but what exactly - I can not understand. I did not find any errors in the db creation script.

DBHelper:

 package menutest.apps.alexbykov.ru.bd; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; class DBHelper extends SQLiteOpenHelper { public static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = "contactDB"; public static final String TABLE_CONTACTS = "contacts"; public static final String KEY_ID = "_id"; public static final String KEY_NAME = "name"; public static final String KEY_MAIL = "mail"; public static final String KEY_POSITION = "position"; public DBHelper(Context context) { // конструктор суперкласса super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_CONTACTS + " (" + KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_NAME + " TEXT," + KEY_MAIL + " TEXT," + KEY_POSITION + " TEXT" + ");"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table if exist" +TABLE_CONTACTS); onCreate(db); } } 

Activation class:

 package menutest.apps.alexbykov.ru.bd; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button btAdd, btRead, btClear; EditText etName, etMail, etPosition; DBHelper dbHelper; public static final String TAG = "DBLog"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btAdd = (Button) findViewById(R.id.btAdd); btAdd.setOnClickListener(this); btRead = (Button) findViewById(R.id.btRead); btRead.setOnClickListener(this); btClear = (Button) findViewById(R.id.btClear); btClear.setOnClickListener(this); etName = (EditText) findViewById(R.id.etName); etMail = (EditText) findViewById(R.id.etMail); etPosition = (EditText)findViewById(R.id.etPosition); dbHelper = new DBHelper(this); } @Override public void onClick(View v) { String name = etName.getText().toString(); String mail = etMail.getText().toString(); String position = etPosition.getText().toString(); SQLiteDatabase database = dbHelper.getWritableDatabase(); ContentValues contentValues = new ContentValues(); switch (v.getId()) { case R.id.btAdd: Log.d(TAG, "--- Insert data in contacts ---"); contentValues.put(DBHelper.KEY_NAME, name); contentValues.put(DBHelper.KEY_MAIL, mail); contentValues.put(DBHelper.KEY_POSITION, position); //get id long rowId = database.insert(DBHelper.TABLE_CONTACTS, null, contentValues); Log.d(TAG, "--- row insered, ID = " + rowId); break; case R.id.btRead: Log.d(TAG, "--- rows in contacts ---"); Cursor cursor = database.query(DBHelper.TABLE_CONTACTS, null, null, null, null, null, null); if (cursor.moveToFirst()) { int idIndex = cursor.getColumnIndex(DBHelper.KEY_ID); int nameIndex = cursor.getColumnIndex(DBHelper.KEY_NAME); int mailIndex = cursor.getColumnIndex(DBHelper.KEY_MAIL); int positionIndex = cursor.getColumnIndex(DBHelper.KEY_POSITION); do { Log.d(TAG, " ID = " + cursor.getInt(idIndex) + " NAME = " + cursor.getString(nameIndex) + " MAIL = " + cursor.getString(mailIndex) + " POSITION = " + cursor.getString(positionIndex) ); } while (cursor.moveToNext()); } else Log.d(TAG, "0 rows"); cursor.close(); break; case R.id.btClear: Log.d(TAG, "---Clear positions---"); int clearCount = database.delete(DBHelper.TABLE_CONTACTS, null, null); Log.d(TAG, "deleted rows count = " + clearCount); break; } dbHelper.close(); } } 
  • one
    It happens if the column is added and sbildil, then it does not see it. Try to demolish the application and restart - Android Android
  • Thanks, helped) - no news
  • one
    @AndroidAndroid is not just "happens", but happens for a very specific reason (see my answer) - Pavel Mayorov

1 answer 1

For any change in the database schema, it is necessary to increase the constant DATABASE_VERSION - it was invented for that. Without this, the onUpgrade method will not be called.