2015-08-03 9 views
0

Это моя основная деятельность, и я получаю исключение на 29-й строке метода insertData() в методе MainActivity, а класс MyDatabaseAdapter() содержит schema.Can u, пожалуйста, помогите мне с тем, где я получаю сообщение об ошибке?Сохранение данных в базе данных sqlite?

import android.content.ContentValues; 
import android.database.sqlite.SQLiteDatabase; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 
    EditText editText; 
    Button button; 

    MyDatabaseAdapter myDatabaseAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     editText=(EditText)findViewById(R.id.editText); 
     button=(Button)findViewById(R.id.button); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String name=editText.getText().toString(); 
       long id=myDatabaseAdapter.insertData(name); 
       if(id<0) 
       { 
        Toast.makeText(MainActivity.this,"Unsuccessful",Toast.LENGTH_LONG); 
       } 
       else 
       { 
        Toast.makeText(MainActivity.this,"Successfull",Toast.LENGTH_LONG).show(); 
       } 

      } 
     }); 
    } 


} 

Это мой SQLite вспомогательный класс

import android.content.ContentValues; 
import android.content.Context; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.widget.Toast; 



public class MyDatabaseAdapter { 

    MyDatabase myDatabase; 
    MyDatabaseAdapter(Context context) 
    { 
     myDatabase=new MyDatabase(context); 
    } 
    public long insertData(String name) 
    { 
     SQLiteDatabase sqLiteDatabase=myDatabase.getWritableDatabase(); 
     ContentValues contentValues=new ContentValues(); 
     contentValues.put(MyDatabase.NAME,name); 
     long id=sqLiteDatabase.insert(myDatabase.TABLE_NAME,null,contentValues); 
     return id; 
    } 

    static class MyDatabase extends SQLiteOpenHelper 
    { 
     private static final String DATABASE_NAME="Mydatabase"; 
     private static final int DATABASE_VERSION=3; 
     private static final String TABLE_NAME="MyContacts"; 
     private static final String NAME="Name"; 
     // private static final String ADDRESS="Address"; 
     private static final String UID="_id"; 
     private static final String CREATE_TABLE="CREATE TABLE "+TABLE_NAME+"("+UID+" INTEGER PRIMARY KEY AUTOINCREMENT,"+NAME+" VARCHAR(255),;"; 
     private static final String DROP_TABLE="DROP TABLE IF EXISTS" +TABLE_NAME; 

     public MyDatabase(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      Toast.makeText(context,"Constructor is called",Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(CREATE_TABLE); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL(DROP_TABLE); 
      onCreate(db); 
     } 
    } 
} 

ответ

1

вы не создать экземпляр класса MyDatabaseAdapter. Попробуйте

myDatabaseAdapter = new MyDatabaseAdapter(this) after setContentView(). 
+0

Я сделал, но все еще делал то же самое, фактически, я получаю исключение, как только я нажимаю кнопку сохранения, как этот android.database.sqlite.SQLiteException: рядом с «EXISTSMyContacts»: синтаксическая ошибка (код 1): при компиляции : DROP TABLE IF EXISTSMyContacts –

+0

Создайте пространство после того, как слово существует .. «DROP TABLE IF EXISTS» + TABLE_NAME to. «DROP TABLE IF EXISTS» + TABLE_NAME –

0

Извините, если я говорю что-то неправильно, я все еще участвую.

Но в строке 29, учитывая, что у вас есть 2 линии для Thepackage и один перерыв, это линия:

не должны долго использоваться для чисел?

 long id=myDatabaseAdapter.insertData(name); 

«долго: Тип долго данных представляет собой 64-разрядное двоичное дополнение Целое подписал давно имеет минимальное значение -263 и максимальное значение 263-1 В Java SE 8.. и позже вы можете использовать длинный тип данных для представления 64-разрядной длины без знака , которая имеет минимальное значение 0 и максимальное значение значение 264-1. Используйте этот тип данных, когда вам нужен диапазон значений шире чем те, которые предоставляются int. Класс Long также содержит методы как compareUnsigned, divideUnsigned и т. д. для поддержки арифметики операции для unsigned l Онг «.

1

Во-первых, вы действительно должны быть в состоянии дать нам больше информации. Вывод вашего логарифма должен показывать, что именно происходит или запускается с отладчиком, чтобы поймать исключение, когда оно происходит. Во всяком случае, с предоставленной информацией, по крайней мере одна проблема заключается в том, что ваш оператор create имеет недопустимый синтаксис. Он оценивает как:

CREATE TABLE MyContacts(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name VARCHAR(255),; 

Не требуется запятая и точка с запятой, и нет закрывающей скобы. Оно должно быть:

CREATE TABLE MyContacts(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name VARCHAR(255)) 

или более правильно:

CREATE TABLE MyContacts(_id INTEGER PRIMARY KEY AUTOINCREMENT,Name TEXT) 

... потому что нет никакого типа VARCHAR в SQLite. Тип affinity преобразует ваш VARCHAR (255) в TEXT, потому что он содержит строку CHAR, но лучше всего указывать типы SQLite только для того, чтобы вы получили то, что ожидаете.

Смежные вопросы