2014-12-14 4 views
2

Итак, я получаю ошибку nullpointerexception в SQLDatabase.java (показано в конце этого сообщения) на нашей базе данных в 216. MusicCenter.java - это действие, и он должен искать ArrayList и вставлять исполнителя, песню название и его тексты в базу данных (будет использоваться позже), но вместо этого он вылетает, и логарифм говорит:наша база данных равна нулю?

По-прежнему нуждается в помощи. Пожалуйста, кто-то

http://i.imgur.com/nWuEzth.png

Song.java:

package com.musicplayer; 

import android.os.StrictMode; 

import com.lyricscloud.SQLDatabase; 


import com.lyricscloud.Websites; 

public class Song { 

public Song(long songID, String songTitle, String songArtist) { 
    id=songID; 
    title=songTitle; 
    artist=songArtist; 
    generateLyricsFunc(artist,title); 
    if(Lyrics!=null && !Lyrics.equals("")) { 
     SQLDatabase db = new SQLDatabase(MusicCenter.c); 
     db.createEntry(artist, title, Lyrics, "Songs");--Error here 
     db.close(); 
    } 
} 
    public long getID(){return id;} 
    public String getTitle(){return title;} 
    public String getLyrics(){return Lyrics;} 
    public String getArtist(){return artist;} 
} 

MusicCenter.java:

 getSongList(); 
     for(int i=0; i<songsAmnt;i++) { 
      SQLDatabase db = new SQLDatabase(this); 
      db.open(); 
      db.createEntry(songList.get(i).getArtist(),songList.get(i).getTitle(),songList.get(i).getLyrics(),"Song"); 
      db.close(); 
     } 

getSongList метод:

public static void getSongList() { 
    ContentResolver musicResolver = c.getContentResolver(); 
    Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
    Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null); 
    if (musicCursor != null && musicCursor.moveToFirst()) { 
     int titleColumn = musicCursor.getColumnIndex 
       (android.provider.MediaStore.Audio.Media.TITLE); 
     int idColumn = musicCursor.getColumnIndex 
       (android.provider.MediaStore.Audio.Media._ID); 
     int artistColumn = musicCursor.getColumnIndex 
       (android.provider.MediaStore.Audio.Media.ARTIST); 
     do { 
      long thisId = musicCursor.getLong(idColumn); 
      String thisTitle = musicCursor.getString(titleColumn); 
      String thisArtist = musicCursor.getString(artistColumn); 
      if(!thisArtist.equals("<unknown>") && !thisArtist.equals("Facebook")) { 
       Log.d(CompName,"Id:" + thisId + " Title:" + thisTitle + " Artist: " + thisArtist); 
       songList.add(new Song(thisId, thisTitle, thisArtist)); //error here 
       songsAmnt =+ 1; 
      } 
     } 
     while (musicCursor.moveToNext()); 
     musicCursor.close(); 
    } 
} 

SQLDatabase .java:

package com.lyricscloud; 

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.util.Log; 
import android.widget.Toast; 

public class SQLDatabase { 

public static final String SONGKEY_ROWID = "_id"; 
public static final String SONGKEY_ARTISTNAME = "artist_name"; 
public static final String SONGKEY_SONGNAME = "song_name"; 
public static final String SONGKEY_LYRICS = "lyrics"; 
public static final String[] SONGALL_KEYS = new String[]{SONGKEY_ROWID, SONGKEY_ARTISTNAME, SONGKEY_SONGNAME, SONGKEY_LYRICS}; 


private static final String DATABASE_NAME = "LyricsCloudDB"; 
private static final String DATABASE_TABLE = "BookmarkTable"; 
private static final String bookMarksTable = "CREATE TABLE " + DATABASE_TABLE + " (" + 
     KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
     KEY_ARTISTNAME + " TEXT NOT NULL, " + 
     KEY_SONGNAME + " TEXT NOT NULL," + 
     KEY_LYRICS + " TEXT NOT NULL);"; 
private static final int DATABASE_VERSION = 3; 
private static SQLDatabase instance = null; 

private DbHelper ourHelper; 
private final Context ourContext; 
private SQLiteDatabase ourDatabase; 
private static final String DATABASE_TABLE_SONGS = "SongsTable"; 
private static final String songsTable = "CREATE TABLE " + DATABASE_TABLE_SONGS + " (" + 
     SONGKEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
     SONGKEY_ARTISTNAME + " TEXT NOT NULL, " + 
     SONGKEY_SONGNAME + " TEXT NOT NULL," + 
     SONGKEY_LYRICS + " TEXT NOT NULL);"; 

private static class DbHelper extends SQLiteOpenHelper { 

    public DbHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 

     db.execSQL(songsTable); 

     db.execSQL(bookMarksTable); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 

     db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE); 
     db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE_SONGS); 
     onCreate(db); 

    } 
} 


public SQLDatabase(Context c) { 
    ourContext = c; 

} 

boolean isTableExists(SQLiteDatabase db, String tableName) 
{ 
    if (tableName == null || db == null || !db.isOpen()) 
    { 
     return false; 
    } 
    Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM sqlite_master WHERE type = ? AND name = ?", new String[] {"table", tableName}); 
    if (!cursor.moveToFirst()) 
    { 
     return false; 
    } 
    int count = cursor.getInt(0); 
    cursor.close(); 
    return count > 0; 
} 

public long createEntry(String artistname, String songname, String lyrics, String which) { 
     if(which.equals("Bookmark")) { 
      ContentValues cv = new ContentValues(); 
      cv.put(KEY_ARTISTNAME, artistname); 
      cv.put(KEY_SONGNAME, songname); 
      cv.put(KEY_LYRICS, lyrics); 
      return ourDatabase.insert(DATABASE_TABLE, null, cv); 
     }else{ 
      try { 
       ContentValues cv = new ContentValues(); 
       cv.put(KEY_ARTISTNAME, artistname); 
       cv.put(KEY_SONGNAME, songname); 
       if(lyrics!=null && !lyrics.equals("")) { 
        cv.put(KEY_LYRICS, lyrics); 
        Log.d("DataBaseShit","Lyrics is not null"); 
       } 
       if(isTableExists(ourDatabase,songsTable)){ 
        Log.d("DataBaseShit","Test"); 
       }else{ 
        Log.d("DataBaseShit","Table not created"); 
        ourDatabase.execSQL(DATABASE_TABLE_SONGS); --Get's an error here 
        if(isTableExists(ourDatabase,songsTable)){ 
         Log.d("DataBaseShit","Test"); 
        }else{ 
         Log.d("DataBaseShit","Table not credated"); 
        } 
       } 
       //Log.d("DataBaseShit", "Artist: " + artistname + " Song:" + songname + " Lyrics:" + lyrics); 
       return ourDatabase.insert(DATABASE_TABLE_SONGS, null, cv); --if I remove ourDatabase.execSQL line above then the error moves to this line. 
      }catch(NullPointerException e){ 
       e.printStackTrace(); 
      } 
     } 
    return 0; 
} 

} 
+0

Это поможет, если вы могли бы включать в себя номера строк, или по крайней мере указать на место ошибка указывает на. Это также поможет включить код для «ourDatabase», если вы не ссылаетесь на SQLDatabase.java. Если вы также можете обрезать любой ненужный код из сообщения, это поможет другим также ответить на ваш вопрос. – Jonathan

+0

Джонатан, я имею в виду SQLDatabase.java, и я сожалею о избыточном количестве кода, который я опубликовал в прошлом, и люди жаловались, что они хотели бы видеть полный код, я отредактировал свой вопрос и достал какой-то код, но я боюсь многого вынести, потому что я не уверен, что понадобится и не понадобится. Я даже не знаю, как этот вывод журнала вышел даже. Я также отметил, где он дает ошибки в Song.java, SQLDatabase.java и MusicCenter.java – Mitch

ответ

0

Вы должны дать SQL-запрос в этой строке ниже скобкой,

ourDatabase.execSQL(DATABASE_TABLE_SONGS); 

Но согласно вашим посвящений DATABASE_TABLE_SONGS = "SongsTable"; который является именем таблицы, а не запрос, чтобы создать таблицу. Вы должны изменения, что линии на

ourDatabase.execSQL(songsTable); 

songsTable является переменной, которую вы фактически инициировали запрос, чтобы создать таблицу.

И когда вы прокомментируете приведенную выше строку, ошибка, очевидно, перейдет к этой строке вставки, так как там вы попытаетесь вставить данные в таблицу, которая не создана. Вышеприведенная линия фактически используется для создания SongsTable

Надеюсь, это поможет!

+0

Спасибо за исправление меня, я уже создал таблицу в onCreate, но видел, будет ли таблица делать, если бы я добавил эту строку и что когда я заметил, что наша база данных была нулевой. – Mitch

0

Вы не инициализировали ourDatabase. Вызов getWritableDatabase() на открытом помощнику, чтобы инициализировать его перед вызовом каких-либо методов на нем:

ourDatabase = getWritableDatabase(); 
+0

Я инициализировал его, чтобы не быть грубым, но если вы посмотрите комментарий Джонатана на мой пост, он сказал, что было слишком много кода, поэтому я удалил инициализацию нашей базы данных и нашего Helper – Mitch

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