Contacts_table 没有名为 contacts_name 的列,尽管我插入了它
Contacts_table has no column named contacts_name,though I insert it
我想知道是否有人可以帮助我。
我收到一条错误消息,指出 column_name 不存在。
但我将它包含在我的 DatabaseCleint 中。我找不到任何错误。
我的数据库Class:
public final class DatabaseClient extends SQLiteOpenHelper {
private SQLiteDatabase db;
private static final int DATABASE_VERSION=2;
private static final String DATABASE_NAME = "Contacts";
private static final String TABLE_NAME = "Contacts_table";
private static final String COLUMN_NAME = "contacts_name";
private static final String COLUMN_NUMBER = "contacts_number";
public DatabaseClient(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
//execute the create table query
db.execSQL( "CREATE TABLE " + TABLE_NAME + " ( " + COLUMN_NAME + " TEXT, " + COLUMN_NUMBER + " TEXT " + " );" );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
//add row to database
public void addContact(String ContactName,String ContactNumber){
ContentValues values=new ContentValues();
values.put(COLUMN_NAME,ContactName);
values.put(COLUMN_NUMBER,ContactNumber);
db=getWritableDatabase();
db.insert(TABLE_NAME,null,values);
db.close();
}
public Cursor getallData(){
//open db for writting
SQLiteDatabase db=this.getWritableDatabase();
Cursor res=db.rawQuery("SELECT * FROM " + TABLE_NAME,null);
return res;
}
public int isTableExist(){
SQLiteDatabase db=this.getWritableDatabase();
Cursor cursor=db.rawQuery("SELECT * FROM " + TABLE_NAME,null);
int count=cursor.getCount();
return count;
}
}
我的主要 Class 是:
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private static final String TAG = "MainActivity";
RecyclerView contactList;
ArrayList<Contact> shareContacts;
PhoneBookAdapter adapter;
DatabaseClient mydatabase;
Boolean permission=false;
int exist;
private String mOrderBy=ContactsContract.Contacts.DISPLAY_NAME_PRIMARY;
private static final int MY_PERMISSIONS_REQUEST_READ_CONTACTS=99;
//TextView textView = null;
// String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
//String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//textView = (TextView) findViewById(R.id.out);
mydatabase=new DatabaseClient(this);
exist=mydatabase.isTableExist();
contactList = findViewById(R.id.contact_list);
permission=checkContactsPermission();
if (permission){
if (exist == 0) {
getSupportLoaderManager().initLoader(1, null, this);
displayAllContacts();
}
}else {
if (exist==0){
getSupportLoaderManager().initLoader(1, null, this);
displayAllContacts();
}
}
displayAllContacts();
}
private void displayAllContacts() {
List<Contact> contactListitems=new ArrayList<>();
Contact contactitems;
Cursor c=mydatabase.getallData();
if(c!=null && c.getCount()>0){
while (c.moveToNext()){
String name=c.getString(0);
String number=c.getString(1);
contactitems=new Contact();
contactitems.setName(name);
contactitems.setPhoneNumber(number);
contactListitems.add(contactitems);
}
}
PhoneBookAdapter adapter=new PhoneBookAdapter(contactListitems,getApplicationContext());
contactList.setLayoutManager(new LinearLayoutManager(this));
contactList.setAdapter(adapter);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if(id==1){
return new CursorLoader(this,ContactsContract.Contacts.CONTENT_URI,
null,
null,
null,
"upper(" +
Phone.DISPLAY_NAME + ")ASC");
}
return null;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if(data!=null && data.getCount()>0){
while (data.moveToNext()){
int hasPhoneNumber=Integer.parseInt(data.getString(data.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
if (hasPhoneNumber>0){
String id=data.getString(data.getColumnIndex(ContactsContract.Contacts._ID));
String name=data.getString(data.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
ContentResolver contentResolver=getContentResolver();
Cursor phone_cursor=contentResolver.query(Phone.CONTENT_URI,
null, Phone.CONTACT_ID + "=?",new String[]{id},null);
if (phone_cursor.moveToNext()){
String phoneNumber=phone_cursor.getString(
phone_cursor.getColumnIndex(Phone.NUMBER)
);
phone_cursor.close();
mydatabase.addContact(name,phoneNumber);
}
}
}
displayAllContacts();
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
public boolean checkContactsPermission(){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED){
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}else {
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
return false;
}else {
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case MY_PERMISSIONS_REQUEST_READ_CONTACTS:{
if ((grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)==PackageManager.PERMISSION_GRANTED){
exist=mydatabase.isTableExist();
if(exist==0){
getLoaderManager().initLoader(1,null, (android.app.LoaderManager.LoaderCallbacks<Object>) getApplicationContext());
}
return;
}
}else {
Toast.makeText(this,"permission denied",Toast.LENGTH_LONG).show();
}
return;
}
}
}
}
显示错误:
01-14 17:09:08.163 9576-9576/com.demo.democontactlist E/SQLiteLog: (1) table Contacts_table has no column named contacts_name
01-14 17:09:08.164 9576-9576/com.demo.democontactlist E/SQLiteDatabase: Error inserting contacts_name=Amma contacts_number=+880 1787-586488
android.database.sqlite.SQLiteException: table Contacts_table has no column named contacts_name (code 1): , while compiling: INSERT INTO Contacts_table(contacts_name,contacts_number) VALUES (?,?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:898)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:509)
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:1499)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1371)
at com.demo.democontactlist.DatabaseClient.addContact(DatabaseClient.java:54)
at com.demo.democontactlist.MainActivity.onLoadFinished(MainActivity.java:121)
at com.demo.democontactlist.MainActivity.onLoadFinished(MainActivity.java:32)
您在更改数据库后是否增加了 DATABASE_VERSION 数量?
onUpgrade()
每次版本号增加时都会被调用。
问题是 onCreate
方法仅在创建数据库时自动 运行。仅更改 onCreate
使用的 SQL 不会应用更改。
有 3 种快速简便的解决方案,都会导致数据丢失。解决方案是:-
- 通过设置删除应用程序的数据。
- 通过设置卸载应用程序。
- 如果
onUpgrade
是调用 onCreate
之后的典型 DROP table(s),则增加数据库版本号。
完成上述操作后,重新运行 应用程序。
如果您需要保留数据,那么此 SQL As Understood By SQLite - ALTER TABLE 可能会有所帮助。
只需卸载并重新安装应用程序即可。发生在我身上很多次:)
我想知道是否有人可以帮助我。 我收到一条错误消息,指出 column_name 不存在。 但我将它包含在我的 DatabaseCleint 中。我找不到任何错误。
我的数据库Class:
public final class DatabaseClient extends SQLiteOpenHelper {
private SQLiteDatabase db;
private static final int DATABASE_VERSION=2;
private static final String DATABASE_NAME = "Contacts";
private static final String TABLE_NAME = "Contacts_table";
private static final String COLUMN_NAME = "contacts_name";
private static final String COLUMN_NUMBER = "contacts_number";
public DatabaseClient(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
//execute the create table query
db.execSQL( "CREATE TABLE " + TABLE_NAME + " ( " + COLUMN_NAME + " TEXT, " + COLUMN_NUMBER + " TEXT " + " );" );
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
//add row to database
public void addContact(String ContactName,String ContactNumber){
ContentValues values=new ContentValues();
values.put(COLUMN_NAME,ContactName);
values.put(COLUMN_NUMBER,ContactNumber);
db=getWritableDatabase();
db.insert(TABLE_NAME,null,values);
db.close();
}
public Cursor getallData(){
//open db for writting
SQLiteDatabase db=this.getWritableDatabase();
Cursor res=db.rawQuery("SELECT * FROM " + TABLE_NAME,null);
return res;
}
public int isTableExist(){
SQLiteDatabase db=this.getWritableDatabase();
Cursor cursor=db.rawQuery("SELECT * FROM " + TABLE_NAME,null);
int count=cursor.getCount();
return count;
}
}
我的主要 Class 是:
public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
private static final String TAG = "MainActivity";
RecyclerView contactList;
ArrayList<Contact> shareContacts;
PhoneBookAdapter adapter;
DatabaseClient mydatabase;
Boolean permission=false;
int exist;
private String mOrderBy=ContactsContract.Contacts.DISPLAY_NAME_PRIMARY;
private static final int MY_PERMISSIONS_REQUEST_READ_CONTACTS=99;
//TextView textView = null;
// String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
//String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//textView = (TextView) findViewById(R.id.out);
mydatabase=new DatabaseClient(this);
exist=mydatabase.isTableExist();
contactList = findViewById(R.id.contact_list);
permission=checkContactsPermission();
if (permission){
if (exist == 0) {
getSupportLoaderManager().initLoader(1, null, this);
displayAllContacts();
}
}else {
if (exist==0){
getSupportLoaderManager().initLoader(1, null, this);
displayAllContacts();
}
}
displayAllContacts();
}
private void displayAllContacts() {
List<Contact> contactListitems=new ArrayList<>();
Contact contactitems;
Cursor c=mydatabase.getallData();
if(c!=null && c.getCount()>0){
while (c.moveToNext()){
String name=c.getString(0);
String number=c.getString(1);
contactitems=new Contact();
contactitems.setName(name);
contactitems.setPhoneNumber(number);
contactListitems.add(contactitems);
}
}
PhoneBookAdapter adapter=new PhoneBookAdapter(contactListitems,getApplicationContext());
contactList.setLayoutManager(new LinearLayoutManager(this));
contactList.setAdapter(adapter);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
if(id==1){
return new CursorLoader(this,ContactsContract.Contacts.CONTENT_URI,
null,
null,
null,
"upper(" +
Phone.DISPLAY_NAME + ")ASC");
}
return null;
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
if(data!=null && data.getCount()>0){
while (data.moveToNext()){
int hasPhoneNumber=Integer.parseInt(data.getString(data.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
if (hasPhoneNumber>0){
String id=data.getString(data.getColumnIndex(ContactsContract.Contacts._ID));
String name=data.getString(data.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
ContentResolver contentResolver=getContentResolver();
Cursor phone_cursor=contentResolver.query(Phone.CONTENT_URI,
null, Phone.CONTACT_ID + "=?",new String[]{id},null);
if (phone_cursor.moveToNext()){
String phoneNumber=phone_cursor.getString(
phone_cursor.getColumnIndex(Phone.NUMBER)
);
phone_cursor.close();
mydatabase.addContact(name,phoneNumber);
}
}
}
displayAllContacts();
}
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
public boolean checkContactsPermission(){
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)!= PackageManager.PERMISSION_GRANTED){
if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.READ_CONTACTS)){
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}else {
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_CONTACTS},
MY_PERMISSIONS_REQUEST_READ_CONTACTS);
}
return false;
}else {
return true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
case MY_PERMISSIONS_REQUEST_READ_CONTACTS:{
if ((grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)==PackageManager.PERMISSION_GRANTED){
exist=mydatabase.isTableExist();
if(exist==0){
getLoaderManager().initLoader(1,null, (android.app.LoaderManager.LoaderCallbacks<Object>) getApplicationContext());
}
return;
}
}else {
Toast.makeText(this,"permission denied",Toast.LENGTH_LONG).show();
}
return;
}
}
}
}
显示错误:
01-14 17:09:08.163 9576-9576/com.demo.democontactlist E/SQLiteLog: (1) table Contacts_table has no column named contacts_name
01-14 17:09:08.164 9576-9576/com.demo.democontactlist E/SQLiteDatabase: Error inserting contacts_name=Amma contacts_number=+880 1787-586488
android.database.sqlite.SQLiteException: table Contacts_table has no column named contacts_name (code 1): , while compiling: INSERT INTO Contacts_table(contacts_name,contacts_number) VALUES (?,?)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:898)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:509)
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:1499)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1371)
at com.demo.democontactlist.DatabaseClient.addContact(DatabaseClient.java:54)
at com.demo.democontactlist.MainActivity.onLoadFinished(MainActivity.java:121)
at com.demo.democontactlist.MainActivity.onLoadFinished(MainActivity.java:32)
您在更改数据库后是否增加了 DATABASE_VERSION 数量?
onUpgrade()
每次版本号增加时都会被调用。
问题是 onCreate
方法仅在创建数据库时自动 运行。仅更改 onCreate
使用的 SQL 不会应用更改。
有 3 种快速简便的解决方案,都会导致数据丢失。解决方案是:-
- 通过设置删除应用程序的数据。
- 通过设置卸载应用程序。
- 如果
onUpgrade
是调用onCreate
之后的典型 DROP table(s),则增加数据库版本号。
完成上述操作后,重新运行 应用程序。
如果您需要保留数据,那么此 SQL As Understood By SQLite - ALTER TABLE 可能会有所帮助。
只需卸载并重新安装应用程序即可。发生在我身上很多次:)