Diff results When i used UnregisterDataSource method of nsIRDFService in C++ and JS!

BenKwan <[email protected]> Wed, 18 Feb 2009 21:56:53 -0800 (PST)
Newsgroups gmane.comp.mozilla.devel.rdf
Organization http://groups.google.com
Message-ID <[email protected]>
i do these in js components:
var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
                     getService(Components.interfaces.nsIRDFService);

   //file path with file:///
    var sFile = RSGetPath('/usercfg/','file') + fileName + '.rdf';

    var fileDS = rdfService.GetDataSourceBlocking(sFile);

    var sRoot = rdfService.GetResource(NSROOT + "root");
    var sModels = rdfService.GetResource("http://www.w3.org/1999/02/22-
rdf-syntax-ns#instanceOf");
    var target = fileDS.GetTarget(sRoot, sModels, true);

    if(null==target)
    {
        // generate RDF文件
        ProRDF(fileName);
        // Unregister RDFDataSource
        rdfService.UnregisterDataSource(fileDS);
        // reload
        fileDS = rdfService.GetDataSourceBlocking(sFile);
        target = fileDS.GetTarget(sRoot, sModels, true);
    }

    // If target is null, then we will know that fileDS may be is
empty or not exist.
    // And we should create the rdf first. Otherwise, we can use it
directly.
    if(null!=target)
    {
        //do sth!
    }

in c++ component:
nsresult rv;

	nsCOMPtr<nsIFile> profilePath ;
	rv = NS_GetSpecialDirectory(NS_APP_USER_PROFILE_50_DIR,getter_AddRefs
(profilePath));
	profilePath->Append(NS_LITERAL_STRING("cerdfdatasource.rdf"));

	nsString rdfFilePath;
	rv = profilePath->GetPath(rdfFilePath);

	nsString preRdfFilePath = NS_LITERAL_STRING("file:\\\\\\");
	preRdfFilePath.Append(rdfFilePath.get());

	nsCString cRdfFilePath;

	NS_UTF16ToCString
(preRdfFilePath,NS_CSTRING_ENCODING_NATIVE_FILESYSTEM,cRdfFilePath);

	nsCOMPtr<nsIRDFService> rdfService = do_GetService("@mozilla.org/rdf/
rdf-service;1",&rv);

	nsCOMPtr<nsIRDFDataSource> rdfDataSource;
	rv = rdfService->GetDataSourceBlocking(cRdfFilePath.get
(),getter_AddRefs(rdfDataSource));

	nsCOMPtr<nsIRDFResource> sRoot ;
	nsCString rootString(NSROOTURI.get());
	rootString.AppendLiteral("root");
	rdfService->GetResource(rootString,getter_AddRefs(sRoot));

	nsCOMPtr<nsIRDFResource> sModel;
	rdfService->GetResource(NS_LITERAL_CSTRING("http://www.w3.org/
1999/02/22-rdf-syntax-ns#instanceOf"),getter_AddRefs(sModel));

	nsCOMPtr<nsIRDFNode> target;
	rv = rdfDataSource->GetTarget(sRoot,sModel,true,getter_AddRefs
(target));

	if(nsnull == target)
	//if(NS_FAILED(rv))
	{
		ProRDF();

		rv = rdfService->UnregisterDataSource(rdfDataSource);

		rv = rdfService->GetDataSourceBlocking(cRdfFilePath.get
(),getter_AddRefs(rdfDataSource));

		rv = rdfDataSource->GetTarget(sRoot,sModel,true,getter_AddRefs
(target));
	}
	else  if(nsnull != target) //if(NS_SUCCEEDED(rv))
	{
        }


the results are different.
if the cerdfdatasource.rdf file is not exist.in js code, first, the
target variable is null,after generate the file and reload
rdfdatasource,target is not null
but in c++ code,the target variable always is null,even after
cerdfdatasource.rdf is generate,and reload the rdfdatasource.and i
restart the app,it runs good! it seem that the rdfdatasource cache is
not refresh in C++!
what is wrong in my code?