2016-01-25 2 views
-1

У меня есть база данных, в которой я хочу выполнить инструкцию SQL, которая находится в файле.
Но я получаю исключение в строке InputStream, и я не знаю почему.
Plese, помогите мне решить эту проблему.Исключение из InputStream, которое вызывает файл R.raw.file

package com.example.hasana.databases; 

import android.content.Context; 
import android.content.res.AssetManager; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.provider.BaseColumns; 
import android.util.Log; 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 

/** 
* Created by hasana on 1/14/2016. 
*/ 
public class DatabaseHelper extends SQLiteOpenHelper implements BaseColumns { 
    private static final String DATABASE_NAME = "mydatabase.db"; 
    private static final int DATABASE_VERSION = 1; 
    public static final String CAT_NAME_COLUMN = "gruppa"; 
    public static final String PHONE_COLUMN = "name"; 
    public static final String AGE_COLUMN = "age"; 
    private static final String DATABASE_TABLE = "cats"; 
     Context mycont; 
     String libraryPath; 
     String sql; 


    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      mycont=context; 
    } 

    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
     super(context, name, factory, version); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     Log.d("mytag", "readFile"); 
//  try { 
//   insertFromFile(mycont,R.raw.sqlstat); 
//  } catch (IOException e) { 
//   e.printStackTrace(); 
//  } 
     db.execSQL(sql); 
    } 
    /** 
    * This reads a file from the given Resource-Id and calls every line of it as a SQL-Statement 
    * 
    * @param context 
    * 
    * @param resourceId 
    * e.g. R.raw.food_db 
    * 
    * @return Number of SQL-Statements run 
    * @throws IOException 
    */ 
    public void insertFromFile(Context context, int resourceId) throws IOException { 

     // Open the resource 
     InputStream insertsStream = context.getResources().openRawResource(resourceId); 
     BufferedReader insertReader = new BufferedReader(new InputStreamReader(insertsStream)); 

     // Iterate through lines (assuming each insert has its own line and theres no other stuff) 
     while (insertReader.ready()) { 
      sql += insertReader.readLine(); 
     } 
     insertReader.close(); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     // Запишем в журнал 
     Log.w("SQLite", "Обновляемся с версии " + oldVersion + " на версию " + newVersion); 

     // Удаляем старую таблицу и создаём новую 
     db.execSQL("DROP TABLE IF IT EXISTS " + DATABASE_TABLE); 
     // Создаём новую таблицу 
     onCreate(db); 
    } 

} 

но InputStream insertsStream = context.getResources().openRawResource(resourceId); я получаю исключение

FATAL EXCEPTION: main   Process: com.example.hasana.databases, PID: 21716 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hasana.databases/com.example.hasana.databases.MainActivity}: java.lang.NullPointerException 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
                       at android.app.ActivityThread.access$800(ActivityThread.java:135) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:136) 
                       at android.app.ActivityThread.main(ActivityThread.java:5001) 
                       at java.lang.reflect.Method.invokeNative(Native Method) 
                       at java.lang.reflect.Method.invoke(Method.java:515) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
                       at dalvik.system.NativeStart.main(Native Method) 
                      Caused by: java.lang.NullPointerException 
                       at android.database.DatabaseUtils.getSqlStatementType(DatabaseUtils.java:1375) 
                       at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1659) 
                       at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603) 
                       at com.example.hasana.databases.DatabaseHelper.onCreate(DatabaseHelper.java:53) 
                       at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
                       at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
                       at com.example.hasana.databases.MainActivity.onCreate(MainActivity.java:23) 
                       at android.app.Activity.performCreate(Activity.java:5231) 
                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 
                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)  
                       at android.app.ActivityThread.access$800(ActivityThread.java:135)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:136)  
                       at android.app.ActivityThread.main(ActivityThread.java:5001)  
                       at java.lang.reflect.Method.invokeNative(Native Method)  
                       at java.lang.reflect.Method.invoke(Method.java:515)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)  
                       at dalvik.system.NativeStart.main(Native Method)  
+0

Если я вместил insertFromFile(), не было бы фатального исключения, поэтому проблема в этой части кода. P.S. Я исправляю эту ошибку sql sytax –

ответ

0

Я решить это. Проблема заключалась в том, что у меня есть два конструктора, и я сначала получаю контекст, но вызываю вторую конструкцию. Я добавляю mycont = context; во втором конструкторе и ОК

DatabaseHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     mycont=context; 
} 

    public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
    super(context, name, factory, version); 
} 
+0

Спасибо me.Thanks me. –

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