Не получить новую созданную таблицу из базы данных - PullRequest
0 голосов
/ 01 сентября 2011

Код моего адаптера базы данных выглядит следующим образом:

package com.quiz.spellingquiz;
import java.io.IOException;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class DBAdapter 
{
    //  Database Operation
    public static final String KEY_ROWID = "_id";
    public static final String KEY_ISBN = "isbn";
    public static final String KEY_TITLE = "title";
    public static final String KEY_WORD = "word";
    public static final String KEY_SOUND = "sound";
    public static final String KEY_PUBLISHER = "publisher";    
    private static final String TAG = "DBAdapter";
    private static final String DATABASE_NAME = "testing";
    public static String DATABASE_TABLE = null;
    private static final int DATABASE_VERSION = 1;

    public static final String DATABASE_CREATE =
        "create table "+DATABASE_TABLE+" (_id integer primary key, "
        + "isbn text not null," 
        + "title text not null,"
        + "word text not null,"
        + "sound text not null,"
        + "publisher text not null);";


    private final Context context; 

    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;


    public DBAdapter(Context ctx, String table_name) 
    {
        this.context = ctx;
        DATABASE_TABLE=table_name;
        DBHelper = new DatabaseHelper(context);
    }

    private static class DatabaseHelper extends SQLiteOpenHelper 
    {
        DatabaseHelper(Context context) 
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

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

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion) 
        {
            Log.w(TAG, "Upgrading database from version "+oldVersion+" to "+newVersion+", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
            onCreate(db);
        }
    }    

    //---opens the database---
    public DBAdapter open() throws SQLException 
    {
        db = DBHelper.getWritableDatabase();
        return this;
    }

    //---closes the database---    
    public void close() 
    {
        DBHelper.close();
    }

    //---insert a title into the database---
    public long insertTitle(String isbn, String title, String word, String sound, String publisher) 
    {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_ISBN, isbn);
        initialValues.put(KEY_TITLE, title);
        initialValues.put(KEY_WORD, word);
        initialValues.put(KEY_SOUND, sound);
        initialValues.put(KEY_PUBLISHER, publisher);
        return db.insert(DATABASE_TABLE, null, initialValues);
    }

    //---deletes a particular title---
    public boolean deleteTitle(long rowId) 
    {
        return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
    }

    public boolean deleteAllTitle()
    {
        return db.delete(DATABASE_TABLE,null, null)>0;
    }
    public Cursor getAllTitles() 
    {
        Cursor mCursor = db.query(DATABASE_TABLE, new String[] {
                KEY_ROWID, 
                KEY_ISBN,
                KEY_TITLE,
                KEY_WORD,
                KEY_SOUND,
                KEY_PUBLISHER}, 
                null, 
                null, 
                null,
                null, 
                null,
                null);

        return mCursor;
    }


    //---retrieves a particular title---
    public Cursor getTitle(long rowId) throws SQLException 
    {
        Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
                        KEY_ROWID,
                        KEY_ISBN, 
                        KEY_TITLE,
                        KEY_WORD,
                        KEY_SOUND,
                        KEY_PUBLISHER
                        }, 
                        KEY_ROWID + "=" + rowId, 
                        null,
                        null, 
                        null, 
                        null, ////////////////////////////
                        null);
        if (mCursor != null) 
        {
            mCursor.moveToFirst();
        }
        return mCursor;
    }
    // to fetch TextFile with Sound file
    public Cursor getSound(String str) throws SQLException
    {
        String file = Environment.getExternalStorageDirectory().getAbsolutePath();
        file = file+"/"+str+".3gp";

        Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
                    KEY_ROWID,
                    KEY_ISBN, 
                    KEY_TITLE,
                    KEY_WORD,
                    KEY_SOUND,
                    KEY_PUBLISHER
                }, 
                KEY_SOUND + "=" +file, 
                null,
                null, 
                null, 
                null,
                null);
if (mCursor != null) 
{
    mCursor.moveToFirst();
}
return mCursor;

    }

    public void deleteAll()
    {
        this.db.delete(DATABASE_TABLE, null, null);
    }

    //---updates a title---
    public boolean updateTitle(long rowId, String isbn, String title,String word,String sound, String publisher) 
    {
        ContentValues args = new ContentValues();
        args.put(KEY_ISBN, isbn);
        args.put(KEY_TITLE, title);
        args.put(KEY_WORD, word);
        args.put(KEY_SOUND, sound);
        args.put(KEY_PUBLISHER, publisher);
        return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
    }
}

Теперь в другом упражнении я создаю объект DatabaseAdapter с именем таблицы следующим образом:

final DBAdapter db = new DBAdapter(this,table_name); // create new database with givan table name

Теперь, пока я получаюданные из этого объекта, это дает мне ошибку вроде:

android.database.sqlite.SQLiteException: no such table: hello: , while compiling: INSERT INTO hello(word, title, sound, publisher, isbn) VALUES(?, ?, ?, ?, ?);

Так где я не прав?Почему я не могу создать таблицу?Что я должен сделать?

См. Это мой код другого действия, откуда я вызываю DBAdapter

  // database object        
    final DBAdapter db = new DBAdapter(this); // create new database with givan table name


    showall.setOnClickListener(new View.OnClickListener() 
    {

        public void onClick(View v) 
        {
            db.open();
            Cursor c = db.getAllTitles();
            while(c.moveToNext())        
            {
                Toast.makeText(EnterWordsActivity.this,
                        "id: " + c.getString(0) + "\n" + 
                        "ISBN: " + c.getString(1) + "\n" +  
                        "TITLE: " + c.getString(2) + "\n" + 
                        "WORD: " + c.getString(3) + "\n" +
                        "SOUND:" + c.getString(4) +"\n"+
                        "PUBLISHER:  " + c.getString(5),Toast.LENGTH_LONG).show();
            }
            db.close();
        }
    });

Журнал ошибок после создания новой таблицы в той же базе данных.

09-01 15:05:52.608: ERROR/AndroidRuntime(596): FATAL EXCEPTION: main

09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): android.database.sqlite.SQLiteException: нет такой таблицы: world:, при компиляции: SELECT _id, isbn, title, word, sound, издатель ОТ мира 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в android.database.sqlite.SQLiteCompiledSql.native_compile (собственный метод) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596):в android.database.sqlite.SQLiteCompiledSql.compile (SQLiteCompiledSql.java:91) 09-01 15: 05: 528: ERROR / AndroidRuntime (596): в android.database.sqlite.SQLiteCompiledSql. (SQLiteCompiledSql.java:64)-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в android.database.sqlite.SQLiteProgram. (SQLiteProgram.java:80) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в Android.database.sqlite.SQLiteQuery. (SQLiteQuery.java:46) 09-01 15:05:52.608: ОШИБКА / AndroidRuntime (596): в android.database.sqlite.SQLiteDirectCursorDriver.query (SQLiteDirectCursorDriver.java:42) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в android.database.sqlite.SQLiteDatabase.rawQueryWithFactory (SQLiteDatabase.java:1345) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в android.database.sqlite.SQLiteDatabase.queryWithFactory (SQLiteDatabase.java:1229) 09-01 15:05:52.608: ОШИБКА / AndroidRuntime (596): в android.database.sqlite.SQLiteDatabase.query (SQLiteDatabase.java:1184) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в android.database.sqlite.SQLiteDatabase.query (SQLiteDatabase.java:1301) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в com.quiz.spellingquiz.DBAdapter.getAllTitles (DBAdapter.java:119) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в com.quiz.spellingquiz.EnterWordsActivity $ 1.onClick (EnterWordsActivity.java:86) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в android.view.View.performClick(View.java:2408) 09-01 15: 05: 52.608: ОШИБКА/ AndroidRuntime (596): на android.view.View $ PerformClick.run (View.java:8816) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): на android.os.Handler.handleCallback (обработчик.Java: 587) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): на android.os.Handler.dispatchMessage (Handler.java:92) 09-01 15: 05.608: ОШИБКА / AndroidRuntime (596): at android.os.Looper.loop (Looper.java:123) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): at android.app.ActivityThread.main (ActivityThread.java:4627) 09-0115: 05: 52.608: ОШИБКА / AndroidRuntime (596): в java.lang.reflect.Method.invokeNative (собственный метод) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в java.lang.reflect.Method.invoke (Method.java:521) 09-01 15: 05: 52.608: ОШИБКА / AndroidRuntime (596): в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:868) 09-0115: 05: 52.608: ОШИБКА / AndroidRuntime (596): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:626) 09-01 15: 05: 528: 60 ОШИБКА / AndroidRuntime (596): в dalvik.system.NativeStart.main (родной метод)

Ответы [ 4 ]

2 голосов
/ 01 сентября 2011

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

 private static final String DATABASE_NAME = "testing";

Это должно быть

 private static final String DATABASE_NAME = "testing.db";

Это, безусловно, будет работать, так как япопробовал ваш код.

И еще одно изменение заключается в следующем:

@Override
        public void onCreate(SQLiteDatabase db) 
        {
            db.execSQL("create table "+DATABASE_TABLE+" (_id integer primary key, "
                    + "isbn text not null," 
                    + "title text not null,"
                    + "word text not null,"
                    + "sound text not null,"
                    + "publisher text not null);");
        }

Добавьте этот код выше вместо

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

Затем просто вызовите этот класс следующим образом:

DBAdapter adapter = new DBAdapter(this,"mytable");
1 голос
/ 01 сентября 2011

используйте этот код

 import java.io.IOException;

import  android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class DBAdapter 
{
//  Database Operation
public static final String KEY_ROWID = "_id";
public static final String KEY_ISBN = "isbn";
public static final String KEY_TITLE = "title";
public static final String KEY_WORD = "word";
public static final String KEY_SOUND = "sound";
public static final String KEY_PUBLISHER = "publisher";    
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "testing";
public static String DATABASE_TABLE = null;
private static final int DATABASE_VERSION = 1;

public static final String DATABASE_CREATE =
    "create table "+DATABASE_TABLE+" (_id integer primary key, "
    + "isbn text not null," 
    + "title text not null,"
    + "word text not null,"
    + "sound text not null,"
    + "publisher text not null);";


private final Context context; 

private DatabaseHelper DBHelper;
private SQLiteDatabase db;


public DBAdapter(Context ctx, String table_name) 
{
    this.context = ctx;
    DATABASE_TABLE=table_name;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper 
{
    DatabaseHelper(Context context) 
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

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

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion,int newVersion) 
    {
        Log.w(TAG, "Upgrading database from version "+oldVersion+" to "+newVersion+", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE);
        onCreate(db);
    }
}    

//---opens the database---
public DBAdapter open() throws SQLException 
{
    db = DBHelper.getWritableDatabase();
    return this;
}

//---closes the database---    
public void close() 
{
    DBHelper.close();
}

//used to create the the new table
public void createNewTable(String t_name){
    this.DATABASE_TABLE=t_name;
    db.execSQL(this.DATABASE_CREATE);
}


//---insert a title into the database---
public long insertTitle(String isbn, String title, String word, String sound, String publisher) 
{
    ContentValues initialValues = new ContentValues();
    initialValues.put(KEY_ISBN, isbn);
    initialValues.put(KEY_TITLE, title);
    initialValues.put(KEY_WORD, word);
    initialValues.put(KEY_SOUND, sound);
    initialValues.put(KEY_PUBLISHER, publisher);
    return db.insert(DATABASE_TABLE, null, initialValues);
}

//---deletes a particular title---
public boolean deleteTitle(long rowId) 
{
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}

public boolean deleteAllTitle()
{
    return db.delete(DATABASE_TABLE,null, null)>0;
}
public Cursor getAllTitles() 
{
    Cursor mCursor = db.query(DATABASE_TABLE, new String[] {
            KEY_ROWID, 
            KEY_ISBN,
            KEY_TITLE,
            KEY_WORD,
            KEY_SOUND,
            KEY_PUBLISHER}, 
            null, 
            null, 
            null,
            null, 
            null,
            null);

    return mCursor;
}


//---retrieves a particular title---
public Cursor getTitle(long rowId) throws SQLException 
{
    Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
                    KEY_ROWID,
                    KEY_ISBN, 
                    KEY_TITLE,
                    KEY_WORD,
                    KEY_SOUND,
                    KEY_PUBLISHER
                    }, 
                    KEY_ROWID + "=" + rowId, 
                    null,
                    null, 
                    null, 
                    null, ////////////////////////////
                    null);
    if (mCursor != null) 
    {
        mCursor.moveToFirst();
    }
    return mCursor;
}
// to fetch TextFile with Sound file
public Cursor getSound(String str) throws SQLException
{
    String file = Environment.getExternalStorageDirectory().getAbsolutePath();
    file = file+"/"+str+".3gp";

    Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {
                KEY_ROWID,
                KEY_ISBN, 
                KEY_TITLE,
                KEY_WORD,
                KEY_SOUND,
                KEY_PUBLISHER
            }, 
            KEY_SOUND + "=" +file, 
            null,
            null, 
            null, 
            null,
            null);
    if (mCursor != null) 
  { 
   mCursor.moveToFirst();
  }
 return mCursor;

}

public void deleteAll()
{
    this.db.delete(DATABASE_TABLE, null, null);
}

//---updates a title---
public boolean updateTitle(long rowId, String isbn, String title,String word,String sound, String publisher) 
{
    ContentValues args = new ContentValues();
    args.put(KEY_ISBN, isbn);
    args.put(KEY_TITLE, title);
    args.put(KEY_WORD, word);
    args.put(KEY_SOUND, sound);
    args.put(KEY_PUBLISHER, publisher);
    return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
}

}

в вашей деятельности

db.open();
      db.createNewTable("ur table name");

это решит вашу проблему

1 голос
/ 01 сентября 2011

В начале, когда будет создан final string DATABASE_CREATE, string DATABASE_TABLE будет null.Поэтому каждый раз, когда используется DATABASE_CREATE, запрос:

DATABASE_CREATE = "create table (_id integer primary key, "
    + "isbn text not null," 
    + "title text not null,"
    + "word text not null,"
    + "sound text not null,"
    + "publisher text not null);"

Этот запрос (без имени таблицы) недействителен.

=== update ===

В string DATABASE_CREATE замените переменную DATABASE_TABLE именем шаблона:

public static final String DATABASE_CREATE =
    "create table #table_name# (_id integer primary key, "
    + "isbn text not null," 
    + "title text not null,"
    + "word text not null,"
    + "sound text not null,"
    + "publisher text not null);";

И замените имя шаблона в onCreate:

@Override
public void onCreate(SQLiteDatabase db) 
{
    String query = DATABASE_CREATE.replace("#table_name#", DATABASE_TABLE);
    db.execSQL(query);
}
0 голосов
/ 31 июля 2013

Если ваши новые измененные настройки не отображаются, я думаю, вам следует обновить версию базы данных. Это выполнит новые изменения и сохранит их

...